Linux – Dominando o comando cut

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

Share Button

CC BY-NC-SA 4.0 Linux – Dominando o comando cut by Cleiton Bueno is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.