Guia prático para o comando CUT do Linux

cut é uma linha de comando Unix usada para extrair seções de cada linha de entrada.

cut filtra o STDIN padrão de outro comando ou arquivo de entrada e envia a saída filtrada para STDOUT .

Vejamos primeiro sua página de ajuda:

$ man cut 

ou

$ cut --help
NAME
cut
- remove sections from each line of files
DESCRIPTION

Print selected parts of lines from each FILE to standard output.
Mandatory arguments to long options are mandatory for short options too.

Usage: cut OPTION... [FILE]...

-b, --bytes=LIST select only these bytes
-c, --characters=LIST select only these characters
-d, --delimiter=DELIM use DELIM instead of TAB for field delimiter
-f, --fields=LIST select only these fields; also print any line that contains no delimiter character, unless the -s option is specified
-n with -b: don't split multibyte characters
--complement complement the set of selected bytes, characters or fields

-s, --only-delimited do not print lines not containing delimiters

--output-delimiter=STRING use STRING as the output delimiter the default is the input


Use one, and only one of -b, -c or -f. Each LIST is made up of one range, or many ranges separated by commas. Selected input is written in the same order that it is read, and is written exactly once. Each range is one of:


N N'
th byte, character or field, counted from 1
N
- from N'th byte, character or field, to end of line
N-M from N'
th to M'th (included) byte, character or field
-M from first to M'
th (included) byte, character or field

With no FILE, or when FILE is -, read standard input.

Portanto, normalmente podemos extrair segmentos de linha por bytes (-b), caracteres (-c) e campos (-f), separados por um delimitador (-d). Vamos ver cada caso.

Cortado por personagem

Usamos a opção cut’s -c para imprimir apenas um intervalo específico de caracteres:

$ echo echo hacker-school-is-awesome > cut.txt
$ cut
-c 2 cut.txt
a

$ cut
-c 3 cut.txt
c

$ cut
-c -3 cut.txt
hac

$ cut
-c -6 cut.txt
hacker

$ cut
-c 6- cut.txt
r
-school-is-awesome

Para selecionar uma coluna de caracteres:

$ cut -c2 cut2.txt
a

b

c

Corte por campo

O campo padrão usado pelo comando cut é TAB .

Vamos criar um arquivo onde o delimitador comum é TAB (para inserir TAB em uma linha de comando, use ^ V (CTRL + V) antes de pressionar TAB):

$ echo "0       1       2" > cut.txt 
$ echo
"a b c" >> cut.txt
$ cat cut
.txt
0 1 2
a b c

$ cut
-f2- cut.txt
1 2
b c

$ cut
-f1- cut.txt
0 1 2
a b c

$ cut
-f3- cut.txt
2
c

Um exemplo clássico de seleção de mais de um campo:

$ grep "/bin/bash" /etc/passwd | cut -d':' -f1,6
root
:/root
myname
:/home/myname

Também podemos selecionar todos os campos, exceto os campos especificados:

$ grep "/bin/bash" /etc/passwd | cut -d':' --complement -s -f7
root
:x:0:0:root:/root
myname
:1000:1000:myname:/home/myname

Opção Delimitadora

Se precisarmos substituir o comportamento padrão e instruir o comando cut para usar um delimitador comum diferente, a opção -d se torna muito útil.

$ echo h-a-c-k-e-r > cut.txt 
$ echo s
-c-h-o-o-l >> cut.txt
$ cat cut
.txt
h
-a-c-k-e-r
s
-c-h-o-o-l
$ cut
-d - -f1- cut.txt
h
-a-c-k-e-r
s
-c-h-o-o-l
$ cut
-d - -f2- cut.txt
a
-c-k-e-r
c
-h-o-o-l
$ cut
-d - -f3- cut.txt
c
-k-e-r
h
-o-o-l
$ cut
-d - -f3 cut.txt
c

h

$ cut
-d - -f-2 cut.txt
h
-a
s
-c
$ cut
-d - -f-2,4 cut.txt
h
-a-k
s
-c-o

Aplicações úteis de CUT

Extrair lista de usuários

Podemos extrair a lista de usuários em um sistema atual do arquivo:/etc/passwd

$ cut -d : -f 1 /etc/passwd
root

bin

daemon

adm

...

Exibir Total Nemory no Sistema Atual

$ free | grep Mem | sed 's/s+/,/g' | cut -d , -f2
5992256

Recuperar um tipo de CPU

$ cat /proc/cpuinfo | grep "name" | cut -d : -f2 | uniq
Intel(R) Core(TM) i5-3230M CPU @ 2.60GHz

Recuperar endereço IP externo

$ wget -q -O X http://ipchicken.com/
$ grep
'^ {8}[0-9]' X | sed 's/s+/,/g' | cut -d , -f2

Obtenha um endereço MAC de minhas interfaces de rede

$ ifconfig eth0 | grep HWaddr | cut -d " " -f 11

Lista de usuários conectados a um sistema atual

$ who | cut -d s -f1

Mostrar qual serviço está usando uma porta

$ grep -w  <PORT> /etc/services | cut -f 1 | uniq

Extraindo informações úteis do PS

$ ps axu | grep google-chrome | sed 's/s+/ /g' | cut -d' ' -f2,11-

Envie apenas as permissões dos arquivos

$ ls -l | cut -c2-10

Produza apenas o tamanho e o nome dos arquivos

$ ls -l | tr -s ' ' ' ' | cut -f5,9 -d ' '