De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: Rubens Queiroz de Almeida
Data de Publicação: 15 de fevereiro de 2018
Outro comando muito útil é o cut
. Para nossos exemplos, utilizaremos um
arquivo chamado exemplos_cut.txt
:
$ cat exemplos_cut.txt
abcdefgh
12345678
ijklmnop
9ABCDEFG
1. Seleção de uma coluna
Para selecionar uma coluna de um arquivo, usamos a diretiva -c
. O comando
a seguir seleciona a terceira coluna de cada linha:
$ cut -c3 exemplos_cut.txt
c
3
k
B
2. Seleção de uma faixa de colunas
Em vez de apenas uma coluna, podemos especificar uma faixa:
$ cut -c3-5 exemplos_cut.txt
cde
345
klm
BCD
A diretiva -c3-5
instrui o comando cut
a pegar as colunas 3, 4 e 5.
3. Seleção de colunas de caracteres especificando apenas a posição de início ou fim.
Podemos também instruir o programa a pegar todas as colunas a partir de uma posição:
$ cut -c3- exemplos_cut.txt
cdefgh
345678
klmnop
BCDEFG
A diretiva -c3-
indica uma faixa de colunas, porém não especifica o fim,
então todas as colunas começando na coluna 3 são selecionadas.
$ cut -c-3 exemplos_cut.txt
abc
123
ijk
9AB
Da mesma forma, a diretiva -c-3
indica uma faixa sem especificar o valor
inicial, que é então assumido como a primeira coluna. Neste exemplo, todas
as colunas até a coluna 3 são selecionadas.
4. Seleção de campos específicos de um arquivo
O comando cut
também aceita delimitadores. Um exemplo clássico é o arquivo
/etc/passwd
, cujos registros contém diversos valores separados pelo delimitador
:
:
root:x:0:0:root:/root:/bin/bash
Como podemos ver, o arquivo /etc/passwd
contém 8 campos.
Para selecionar o nome de todos os usuários definidos no arquivo
/etc/passwd
, fazemos:
$ cut -d: -f1 /etc/passwd
root
daemon
bin
sys
sync
games
man
lp
mail
...
Da mesma forma como fizemos com as colunas nos exemplos anteriores, podemos selecionar múltiplos campos de um arquivo.
$ cut -d: -f1,7 /etc/passwd
root:/bin/bash
daemon:/usr/sbin/nologin
bin:/usr/sbin/nologin
sys:/usr/sbin/nologin
sync:/bin/sync
games:/usr/sbin/nologin
man:/usr/sbin/nologin
lp:/usr/sbin/nologin
Este comando seleciona dois campos do arquivo /etc/passwd
: o nome do
usuário e a shell atribuída a este usuário.
5. Exibição de todos os campos, com exceção de alguns
Vamos agora combinar o comando grep
com o comando cut
, exibindo
todas as informações sobre determinados usuários, excluindo o campo 7,
a shell definida para este usuário:
grep "/bin/bash" /etc/passwd | cut -d':' --complement -s -f7
root:x:0:0:root:/root
queiroz:x:1000:1000:Rubens Queiroz de Almeida,,,:/home/queiroz
Como este comando foi exibido em meu computador pessoal, apenas os usuários
root
e queiroz
possuem a shell /bin/bash
. Para estes usuários
se exibiu a linha correspondente do arquivo /etc/passwd
, com exceção do
campo 7, a shell.
6. Alterar o delimitador dos campos na saída do comando cut
Como pudemos ver nos exemplos com o arquivo /etc/passwd
, o delimitador
utilizado para gerar a saída do comando cut
foi o mesmo do arquivo
original. Para alterar o delimitador a ser usado, utilizamos a diretiva
--output-delimiter
:
$ cut -d':' -s -f1,6,7 --output-delimiter='#' /etc/passwd
root#/root#/bin/bash
daemon#/usr/sbin#/usr/sbin/nologin
bin#/bin#/usr/sbin/nologin
sys#/dev#/usr/sbin/nologin
sync#/bin#/bin/sync
games#/usr/games#/usr/sbin/nologin
man#/var/cache/man#/usr/sbin/nologin
lp#/var/spool/lpd#/usr/sbin/nologin
mail#/var/mail#/usr/sbin/nologin
news#/var/spool/news#/usr/sbin/nologin
...
7. Combinação do comando cut
com outros comandos
O comando cut
é muito utilizado em conjunto com outros processos, visto que
ele pode extrair trechos da saída gerada por outros comandos.
Vejamos um exemplo com o comando ps
(listagem de processos). O comando
ps
gera uma saída como abaixo:
$ ps -ef | head
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Nov03 ? 00:00:03 /sbin/init splash
root 2 0 0 Nov03 ? 00:00:00 [kthreadd]
root 3 2 0 Nov03 ? 00:00:00 [ksoftirqd/0]
root 5 2 0 Nov03 ? 00:00:00 [kworker/0:0H]
root 7 2 0 Nov03 ? 00:00:52 [rcu_sched]
root 8 2 0 Nov03 ? 00:00:00 [rcu_bh]
root 9 2 0 Nov03 ? 00:00:00 [migration/0]
root 10 2 0 Nov03 ? 00:00:00 [watchdog/0]
root 11 2 0 Nov03 ? 00:00:00 [watchdog/1]
A saída é formatada em colunas e para isto, o que separa os campos são um
ou mais espaços em branco. Isto é um problema para nós, pois o comando cut
aceita apenas um caractere como separador.
Precisamos então combinar o comando cut
com outros comandos para eliminar
os múltiplos espaços em branco em sequência.
Vejamos como podemos fazer isto:
$ ps -ef | sed 's/\s\+/ /g' | cut -d' ' -f2,8
PID CMD
1 /sbin/init
2 [kthreadd]
3 [ksoftirqd/0]
5 [kworker/0:0H]
7 [rcu_sched]
8 [rcu_bh]
9 [migration/0]
10 [watchdog/0]
11 [watchdog/1]
... várias linhas removidas
A diretiva \s
do sed casa com os caracteres em branco <TAB>
e o próprio
espaço em branco, e o caractere +
indica que dois ou mais caracteres em
branco ou tabulações devem ser substituídas por apenas um espaço em branco,
tornando assim a saída gerada adequada para processamento pelo comando cut
.
Para substituir os espaços em branco em sequência, podemos também usar o comando tr
:
$ ps -ef | tr -s ' ' | cut -d' ' -f2,8
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários