Mesclando um pouco do man do comando, podemos resumir que o cut, um dos comandos do pacote GNU core-utils combinando os seus diversos parâmetros, conseguimos imprimir na saída padrão uma sessão ou parte de uma string de um arquivo.
Vamos criar um arquivo de texto simples (texto.txt) com algumas palavras/frases:
Linux Ubuntu Raspberry PI Beaglebone Black i.MX6 Intel Edison Arduino Yocto Project Python Flask PySerial Android Acesse o blog www.cleitonbueno.com e cadastre seu e-mail para receber as novidades ;)
Vamos a alguns parâmetros/opções:
-b | Seleciona somente o(s) byte(s) informado(s) |
-c | Seleciona somente o(s) caractere(s) informado(s) |
-d | Especifica o delimitador a ser usado, padrão é TAB |
-f | Seleciona somente o(s) campo(s) informado(s), also print any line that contains no delimiter character, unless the -s option is specified |
–complement | Complementa baseado em bytes, caracteres ou campos especificados |
-s | Não imprimir linhas que não possuem o delimitador especificado |
–output-delimiter | Usa uma STRING como delimitadora para a nova saida |
Vamos a alguns exemplos, começando com o parâmetro ‘-c‘ onde podemos fornecer 1 caractere, um intervalo ou sequencia de caracteres a serem impressos em cada linha.
$ cut -c1 texto.txt L U R B i I A Y P F P A A
Agora somente o caractere 4 de cada linha.
$ cut -c4 texto.txt u n p g X e u t h s e r s
Pegando apenas do caractere 1 ao 5.
$ cut -c1-5 texto.txt Linux Ubunt Raspb Beagl i.MX6 Intel Ardui Yocto Pytho Flask PySer Andro Acess
Agora apenas do 3 ao 10.
$ cut -c3-10 texto.txt nux untu spberry aglebone MX6 tel Edis duino cto Proj thon ask Serial droid esse o b
Pegando caracteres em intervalos diferentes.
$ cut -c1,3 texto.txt Ln Uu Rs Ba iM It Ad Yc Pt Fa PS Ad Ae
Um intervalo com mais caracteres:
$ cut -c1,3,5 texto.txt Lnx Uut Rsb Bal iM6 Itl Adi Yco Pto Fak PSr Ado Aes
Ignorando apenas o primeiro caractere e imprimindo o resto da linha.
$ cut -c2- texto.txt inux buntu aspberry PI eaglebone Black .MX6 ntel Edison rduino octo Project ython lask ySerial ndroid cesse o blog www.cleitonbueno.com e cadastre seu e-mail para receber as novidades ;)
Imprimindo até o caractere 2, depois pulando até o 5 e imprimindo até o final da linha.
$ cut -c-2,5- texto.txt Lix Ubtu Raberry PI Belebone Black i.6 Inl Edison Arino Yoo Project Pyon Flk Pyrial Anoid Acse o blog www.cleitonbueno.com e cadastre seu e-mail para receber as novidades ;)
Baseado no nosso texto exemplo, vamos usar o ‘.‘ como delimitador para as linhas e junto utilizar o parâmetro ‘-f‘ para dizer ao comando qual campo queremos.
$ cut -d"." -f1 texto.txt Linux Ubuntu Raspberry PI Beaglebone Black i Intel Edison Arduino Yocto Project Python Flask PySerial Android Acesse o blog www
Baseado no delimitador ‘.‘ o primeiro campo é o antes dele o restante é ignorado, mas as linhas que não possuem ponto também foram impressas, vamos ver como ignorar as que não possuem delimitador.
$ cut -s -d"." -f1 texto.txt i Acesse o blog www
Adicionamos o parâmetro ‘-s’ e resolvemos esta problema, vamos agora imprimir o segundo campo.
$ cut -s -d"." -f2 texto.txt MX6 cleitonbueno
E também podemos imprimir com intervalos no ‘-f‘.
$ cut -s -d"." -f1,3 texto.txt i Acesse o blog www.com e cadastre seu e-mail para receber as novidades ;)
As vezes você quer ignorar um campo e imprimir o restante, para isso pode usar o ‘–complement‘.
$ cut -s -d"." -f1 texto.txt i Acesse o blog www $ cut -s -d"." -f1 texto.txt --complement MX6 cleitonbueno.com e cadastre seu e-mail para receber as novidades ;)
O ‘–complement‘ é valido para ‘-c‘ também.
$ cut -c1 texto.txt --complement inux buntu aspberry PI eaglebone Black .MX6 ntel Edison rduino octo Project ython lask ySerial ndroid cesse o blog www.cleitonbueno.com e cadastre seu e-mail para receber as novidades ;)
Agora um exemplo de usando delimitador vamos trocar a string de saída por outro delimitador.
$ cut -s -d"." -f1- texto.txt --output-delimiter="$" i$MX6 Acesse o blog www$cleitonbueno$com e cadastre seu e-mail para receber as novidades ;)
No caso, antes nosso delimitador era ‘.‘ agora trocamos por ‘$‘ usando o parâmetro ‘–output-delimiter‘.
Com todas as opções acima, e os exemplos aplicados podemos facilmente manipular e criar vários scripts uteis para trocar delimitadores, cortar ou ignorar partes de strings.
Extra com cut
Você pode ainda combinar o cut com outros comandos, por exemplo o grep. Vamos filtrar o /etc/passwd pelo usuário cleiton e depois aplicar o comando.
$ grep "cleiton" /etc/passwd cleiton:x:1000:1000:Cleiton Bueno,,,:/home/cleiton:/bin/bash $ grep "cleiton" /etc/passwd | cut -d":" -f3,4 1000:1000 $ grep "cleiton" /etc/passwd | cut -d":" -f1-4,6- cleiton:x:1000:1000:/home/cleiton:/bin/bash $ grep "cleiton" /etc/passwd | cut -d":" -f1-4,6- --output-delimiter="@" cleiton@x@1000@1000@/home/cleiton@/bin/bash
Então após o grep, fizemos algumas manipulações, pegando apenas UID e GID, depois pulando apenas o nome completo do usuário e por fim, substituindo “:” por “@“.
Espero que tenham gostado.
Até a próxima!
Referências
$ info cut
$ man 8 cut
Linux – Dominando o comando cut by Cleiton Bueno is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.