O comando Linux cut
permite extrair partes de texto de arquivos ou fluxos de dados. É especialmente útil para trabalhar com dados delimitados, como arquivos CSV . Aqui está o que você precisa saber.
Índice
O comando de corte
O cut
comando é um veterano do mundo Unix , fazendo sua estreia em 1982 como parte do AT&T System III UNIX. Seu objetivo na vida é cortar seções de texto de arquivos ou fluxos, de acordo com os critérios que você definir. Sua sintaxe é tão simples quanto seu propósito, mas é essa simplicidade conjunta que o torna tão útil.
À maneira tradicional do UNIX, combinando cut
com outros utilitários comogrep
você pode criar soluções elegantes e poderosas para problemas desafiadores. Embora existam diferentes versões do cut
, vamos discutir a versão GNU/Linux padrão. Esteja ciente de que outras versões, principalmente as cut
encontradas nas variantes BSD , não incluem todas as opções descritas aqui.
Você pode verificar qual versão está instalada em seu computador emitindo este comando:
cortar --versão
Se você vir “GNU coreutils” na saída, você está na versão que descreveremos neste artigo. Todas as versões do cut
têm algumas dessas funcionalidades, mas a versão Linux teve melhorias adicionadas a ela.
Primeiros Passos Com corte
Quer estejamos canalizando informações ou cut
usando para ler um arquivo , os comandos que usamos são os mesmos. Qualquer coisa que você possa fazer em um fluxo de entrada pode ser feito em uma linha de texto de um arquivo e vice-versa . Podemos dizer para trabalhar com bytes, caracteres ou campos delimitados.cut
cut
cut
Para selecionar um único byte, usamos a -b
opção (byte) e informamos cut
qual byte ou bytes queremos. Neste caso, é o byte cinco. Estamos enviando a string “how-to geek” para o cut
comando com um pipe, “|”, de echo
.
echo 'como fazer geek' | corte -b 5
O quinto byte nessa string é “t”, então cut
responde imprimindo “t” na janela do terminal.
Para especificar um intervalo , usamos um hífen. Para extrair os bytes 5 até—e incluindo—11, emitimos este comando:
echo 'como fazer geek' | corte -b 5-11
Você pode fornecer vários bytes ou intervalos individuais separando-os com vírgulas. Para extrair o byte 5 e o byte 11, use este comando:
echo 'como fazer geek' | corte -b 5,11
Para obter a primeira letra de cada palavra, podemos usar este comando:
echo 'como fazer geek' | corte -b 1,5,8
Se você usar o hífen sem um primeiro número, cut
retornará tudo da posição 1 até o número. Se você usar o hífen sem um segundo número, cut
retornará tudo, desde o primeiro número até o final do fluxo ou linha.
echo 'como fazer geek' | corte -b -6
echo 'como fazer geek' | corte -b 8-
Usando corte com caracteres
Usar cut
com caracteres é praticamente o mesmo que usá-lo com bytes. Em ambos os casos, cuidados especiais devem ser tomados com caracteres complexos. Ao usar a -c
opção (caractere), dizemos cut
para trabalhar em termos de caracteres, não de bytes.
echo 'como fazer geek' | corte -c 1,5,8
echo 'como fazer geek' | corte -c 8-11
Estes funcionam exatamente como você esperaria. Mas dê uma olhada neste exemplo. É uma palavra de seis letras, portanto, pedir cut
para retornar os caracteres de um a seis deve retornar a palavra inteira. Mas não. Falta um caractere. Para ver a palavra inteira temos que pedir os caracteres de um a sete.
echo 'piñata' | corte -c 1-6
echo 'piñata' | corte -c 1-7
O problema é que o caractere “ñ” é na verdade composto de dois bytes. Podemos ver isso com bastante facilidade. Temos um pequeno arquivo de texto contendo esta linha de texto:
cat unicode.txt
Vamos examinar esse arquivo com o hexdump
utilitário. Usar a -C
opção (canônica) nos dá uma tabela de dígitos hexadecimais com o equivalente ASCII à direita. Na tabela ASCII, o “ñ” não é mostrado, em vez disso, há pontos representando dois caracteres não imprimíveis. Esses são os bytes destacados na tabela hexadecimal .
hexdump -C unicode.txt
Esses dois bytes são usados pelo programa de exibição – neste caso, o shell Bash – para identificar o “ñ”. Muitos caracteres Unicode usam três ou mais bytes para representar um único caractere.
Se pedirmos o caractere 3 ou o caractere 4, é mostrado o símbolo de um caractere não imprimível. Se pedirmos os bytes 3 e 4, o shell os interpreta como “ñ”.
echo 'piñata' | corte -c 3
echo 'piñata' | corte -c 4
echo 'piñata' | corte -c 3-4
Usando corte com dados delimitados
Podemos pedir cut
para dividir linhas de texto usando um delimitador especificado. Por padrão, cut usa um caractere de tabulação, mas é fácil dizer a ele para usar o que quisermos. Os campos no arquivo “/etc/passwd” são separados por dois pontos “:”, então usaremos isso como nosso delimitador e extrairemos algum texto.
As partes de texto entre os delimitadores são chamadas de campos e são referenciadas como bytes ou caracteres, mas são precedidas pela -f
opção (campos). Você pode deixar um espaço entre o “f” e o dígito, ou não.
O primeiro comando usa a -d
opção (delimitador) para dizer ao corte para usar “:” como delimitador. Ele vai puxar o primeiro campo de cada linha no arquivo “/etc/passwd”. Essa será uma lista longa, então estamos usando head
a -n
opção (número) para mostrar apenas as cinco primeiras respostas. O segundo comando faz a mesma coisa, mas usa tail
para nos mostrar as últimas cinco respostas.
cut -d':' -f1 /etc/passwd | cabeça -n 5
cut -d':' -f2 /etc/passwd | cauda -n 5
Para extrair uma seleção de campos, liste-os como uma lista separada por vírgulas. Este comando extrairá os campos um a três, cinco e seis.
cut -d':' -f1-3,5,6 /etc/passwd | cauda -n 5
Ao incluir grep
no comando, podemos procurar linhas que incluam “/bin/bash”. Isso significa que podemos listar apenas as entradas que têm o Bash como shell padrão. Geralmente, serão as contas de usuário “normais”. Pediremos campos de um a seis porque o sétimo campo é o campo shell padrão e já sabemos o que é — estamos procurando por ele.
grep "/bin/bash" /etc/passwd | corte -d':' -f1-6
Outra maneira de incluir todos os campos, exceto um, é usar a --complement
opção. Isso inverte a seleção do campo e mostra tudo o que não foi solicitado. Vamos repetir o último comando, mas pedir apenas o campo sete. Em seguida, executaremos esse comando novamente com a --complement
opção.
grep "/bin/bash" /etc/passwd | corte -d':' -f7
grep "/bin/bash" /etc/passwd | corte -d':' -f7 --complemento
O primeiro comando encontra uma lista de entradas, mas o campo sete não nos dá nada para distinguir entre elas, então não sabemos a quem as entradas se referem. No segundo comando, adicionando a --complement
opção, obtemos tudo, exceto o campo sete.
Tubulação cortada em corte
Continuando com o arquivo “/etc/passwd”, vamos extrair o campo cinco. Este é o nome real do usuário que possui a conta de usuário .
grep "/bin/bash" /etc/passwd | corte -d':' -f5
O quinto campo tem subcampos separados por vírgulas. Eles raramente são preenchidos, então aparecem como uma linha de vírgulas.
Podemos remover as vírgulas canalizando a saída do comando anterior para outra invocação de cut
. A segunda instância de cut
usa a vírgula “,” como seu delimitador. A -s
opção (somente delimitado) diz cut
para suprimir os resultados que não têm o delimitador neles.
grep "/bin/bash" /etc/passwd | corte -d':' -s -f5 | corte -d',' -s -f1
Como a entrada raiz não tem subcampos de vírgula no quinto campo, ela é suprimida e obtemos os resultados que buscamos — uma lista dos nomes dos usuários “reais” configurados neste computador.
O delimitador de saída
Temos um pequeno arquivo com alguns valores separados por vírgula. Os campos nestes dados fictícios são:
- ID : um número de ID do banco de dados
- First : O primeiro nome do assunto.
- Last : O sobrenome do assunto.
- email : Seu endereço de email.
- Endereço IP : Seu endereço IP .
- Marca : A marca do veículo motorizado que dirigem.
- Modelo : O modelo do veículo motorizado que dirigem.
- Ano : O ano em que seu veículo motorizado foi construído.
gato pequeno.csv
Se dissermos ao cut para usar a vírgula como delimitador, podemos extrair campos como fizemos antes. Às vezes, você precisará extrair dados de um arquivo, mas não deseja que o delimitador de campo seja incluído nos resultados. Usando o --output-delimiter
podemos dizer cut qual caractere – ou na verdade, sequência de caracteres – usar em vez do delimitador real.
corte -d ',' -f 2,3 pequeno.csv
cut -d ',' -f 2,3 small.csv --output-delimiter=' '
O segundo comando diz cut
para substituir as vírgulas por espaços.
Podemos levar isso adiante e usar esse recurso para converter a saída em uma lista vertical. Este comando usa um novo caractere de linha como delimitador de saída. Observe o “$” que precisamos incluir para que o caractere de nova linha funcione e não seja interpretado como uma sequência literal de dois caracteres.
Usaremos grep
para filtrar a entrada para Morgana Renwick e pedir cut
para imprimir todos os campos do campo dois até o final do registro e usar um caractere de nova linha como delimitador de saída.
grep 'renwick' small.csv | cut -d ',' -f2- --output-delimiter=$''
Um Oldie, mas Goldie
No momento em que escrevo, o comando little cut está se aproximando de seu 40º aniversário, e ainda o estamos usando e escrevendo sobre ele hoje. Suponho que cortar texto hoje é o mesmo que era há 40 anos. Ou seja, muito mais fácil quando você tem a ferramenta certa à mão.