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.

Exemplos de uso do comando cut

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 

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


Veja a relação completa dos artigos de Rubens Queiroz de Almeida