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 ' '