Pesquisa de site

12 comandos úteis para filtrar texto para operações eficazes de arquivos no Linux


Neste artigo, revisaremos uma série de ferramentas de linha de comando que atuam como filtros no Linux. Um filtro é um programa que lê a entrada padrão, executa uma operação sobre ela e grava os resultados na saída padrão.

Por esta razão, pode ser usado para processar informações de maneiras poderosas, como reestruturar a saída para gerar relatórios úteis, modificar texto em arquivos e muitas outras tarefas de administração do sistema.

Com isso dito, abaixo estão alguns dos filtros úteis de arquivo ou texto no Linux.

1. Comando Awk

Awk é uma notável linguagem de varredura e processamento de padrões, que pode ser usada para construir filtros úteis no Linux. Você pode começar a usá-lo lendo nossa série Awk, Parte 1 a Parte 13.

Além disso, leia também a página de manual do awk para obter mais informações e opções de uso:

man awk

2. Comando Sed

sed é um poderoso editor de stream para filtrar e transformar texto. Já escrevemos dois artigos úteis sobre sed, que você pode ler aqui:

  1. Como usar o comando GNU ‘sed’ para criar, editar e manipular arquivos no Linux
  2. 15 dicas e truques úteis de comando ‘sed’ para tarefas diárias de administração do sistema Linux

A página man do sed adicionou opções e instruções de controle:

man sed

3. Comandos Grep, Egrep, Fgrep, Rgrep

Esses filtros geram linhas que correspondem a um determinado padrão. Eles leem linhas de um arquivo ou entrada padrão e imprimem todas as linhas correspondentes por padrão na saída padrão.

Nota: O programa principal é grep, as variações são simplesmente as mesmas do uso de opções grep específicas abaixo (e ainda estão sendo usadas para compatibilidade com versões anteriores):

egrep = grep -E
fgrep = grep -F
rgrep = grep -r  

Abaixo estão alguns comandos básicos do grep:

tecmint@TecMint ~ $ grep "aaronkilik" /etc/passwd
aaronkilik:x:1001:1001::/home/aaronkilik:

tecmint@TecMint ~ $ cat /etc/passwd | grep "aronkilik"
aaronkilik:x:1001:1001::/home/aaronkilik:

Você pode ler mais sobre Qual é a diferença entre Grep, Egrep e Fgrep no Linux?.

4. comando principal

head é usado para exibir as primeiras partes de um arquivo, ele gera as primeiras 10 linhas por padrão. Você pode usar o sinalizador -n num para especificar o número de linhas a serem exibidas:

tecmint@TecMint ~ $ head /var/log/auth.log  
Jan  2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan  2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session closed for user root
Jan  2 10:51:34 TecMint sudo:  tecmint : TTY=unknown ; PWD=/home/tecmint ; USER=root ; COMMAND=/usr/lib/linuxmint/mintUpdate/checkAPT.py
Jan  2 10:51:34 TecMint sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Jan  2 10:51:39 TecMint sudo: pam_unix(sudo:session): session closed for user root
Jan  2 10:55:01 TecMint CRON[4099]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan  2 10:55:01 TecMint CRON[4099]: pam_unix(cron:session): session closed for user root
Jan  2 11:05:01 TecMint CRON[4138]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan  2 11:05:01 TecMint CRON[4138]: pam_unix(cron:session): session closed for user root
Jan  2 11:09:01 TecMint CRON[4146]: pam_unix(cron:session): session opened for user root by (uid=0)

tecmint@TecMint ~ $ head  -n 5 /var/log/auth.log  
Jan  2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan  2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session closed for user root
Jan  2 10:51:34 TecMint sudo:  tecmint : TTY=unknown ; PWD=/home/tecmint ; USER=root ; COMMAND=/usr/lib/linuxmint/mintUpdate/checkAPT.py
Jan  2 10:51:34 TecMint sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Jan  2 10:51:39 TecMint sudo: pam_unix(sudo:session): session closed for user root

Aprenda como usar o comando head com os comandos tail e cat para uso eficaz no Linux.

5. Comando cauda

tail exibe as últimas partes (10 linhas por padrão) de um arquivo. Use a opção -n num para especificar o número de linhas a serem exibidas.

O comando abaixo irá gerar as últimas 5 linhas do arquivo especificado:

tecmint@TecMint ~ $ tail -n 5 /var/log/auth.log
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on :: port 22.
Jan  6 13:01:27 TecMint sshd[1269]: Received SIGHUP; restarting.
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on :: port 22.

Além disso, tail possui uma opção especial -f para observar alterações em um arquivo em tempo real (especialmente arquivos de log).

O comando a seguir permitirá monitorar alterações no arquivo especificado:

tecmint@TecMint ~ $ tail -f /var/log/auth.log
Jan  6 12:58:01 TecMint sshd[1269]: Server listening on :: port 22.
Jan  6 12:58:11 TecMint sshd[1269]: Received SIGHUP; restarting.
Jan  6 12:58:12 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
Jan  6 12:58:12 TecMint sshd[1269]: Server listening on :: port 22.
Jan  6 13:01:27 TecMint sshd[1269]: Received SIGHUP; restarting.
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on :: port 22.
Jan  6 13:01:27 TecMint sshd[1269]: Received SIGHUP; restarting.
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on :: port 22.

Leia a página de manual tail para obter uma lista completa de opções e instruções de uso:

man tail

6. comando de classificação

classificar é usado para classificar linhas de um arquivo de texto ou de entrada padrão.

Abaixo está o conteúdo de um arquivo chamado domains.list:

tecmint@TecMint ~ $ cat domains.list
linux-console.net
linux-console.net
news.linux-console.net
news.linux-console.net
linuxsay.com
linuxsay.com
windowsmint.com
windowsmint.com

Você pode executar um comando de classificação simples para classificar o conteúdo do arquivo da seguinte forma:

tecmint@TecMint ~ $ sort domains.list
linuxsay.com
linuxsay.com
news.linux-console.net
news.linux-console.net
linux-console.net
linux-console.net
windowsmint.com
windowsmint.com

Você pode usar o comando sort de várias maneiras. Leia alguns dos artigos úteis sobre o comando sort da seguinte forma:

  1. 14 exemplos úteis de comando ‘sort’ do Linux – Parte 1
  2. 7 exemplos interessantes de comandos ‘sort’ do Linux – Parte 2
  3. Como encontrar e classificar arquivos com base na data e hora da modificação
  4. Como classificar a saída do comando ‘ls’ pela data e hora da última modificação

7. Comando uniq

O comando uniq é usado para relatar ou omitir linhas repetidas, ele filtra as linhas da entrada padrão e grava o resultado na saída padrão.

Depois de executar sort em um fluxo de entrada, você pode remover linhas repetidas com uniq como no exemplo abaixo.

Para indicar o número de ocorrências de uma linha, use a opção -c e ignore as diferenças de maiúsculas e minúsculas durante a comparação, incluindo a opção -i:

tecmint@TecMint ~ $ cat domains.list
linux-console.net
linux-console.net
news.linux-console.net
news.linux-console.net
linuxsay.com
linuxsay.com
windowsmint.com

tecmint@TecMint ~ $ sort domains.list | uniq -c 
2 linuxsay.com
2 news.linux-console.net
2 linux-console.net
1 windowsmint.com 

Leia a página de manual do uniq para obter mais informações e sinalizações de uso:

man uniq

8. Comando fmt

fmt formatador de texto simples e ideal, ele reformata parágrafos em um arquivo especificado e imprime os resultados na saída padrão.

A seguir está o conteúdo extraído do arquivo domain-list.txt:

1.linux-console.net 2.news.linux-console.net 3.linuxsay.com 4.windowsmint.com

Para reformatar o conteúdo acima para uma lista padrão, execute o seguinte comando com a opção -w usada para definir a largura máxima da linha:

tecmint@TecMint ~ $ cat domain-list.txt 
1.linux-console.net 2.news.linux-console.net 3.linuxsay.com 4.windowsmint.com

tecmint@TecMint ~ $ fmt -w 1 domain-list.txt
1.linux-console.net 
2.news.linux-console.net 
3.linuxsay.com 
4.windowsmint.com

9. pr Comando

O comando pr converte arquivos de texto ou entrada padrão para impressão. Por exemplo, em sistemas Debian, você pode listar todos os pacotes instalados da seguinte forma:

dpkg -l

Para organizar a lista em páginas e colunas prontas para impressão, emita o seguinte comando.

tecmint@TecMint ~ $ dpkg -l | pr --columns 3 -l 20  

2017-01-06 13:19                                                  Page 1


Desired=Unknown/Install ii  adduser		ii  apg
| Status=Not/Inst/Conf- ii  adwaita-icon-theme	ii  app-install-data
|/ Err?=(none)/Reinst-r ii  adwaita-icon-theme- ii  apparmor
||/ Name		ii  alsa-base		ii  apt
+++-=================== ii  alsa-utils		ii  apt-clone
ii  accountsservice	ii  anacron		ii  apt-transport-https
ii  acl			ii  apache2		ii  apt-utils
ii  acpi-support	ii  apache2-bin		ii  apt-xapian-index
ii  acpid		ii  apache2-data	ii  aptdaemon
ii  add-apt-key		ii  apache2-utils	ii  aptdaemon-data


2017-01-06 13:19                                                  Page 2


ii  aptitude		ii  avahi-daemon	ii  bind9-host
ii  aptitude-common	ii  avahi-utils		ii  binfmt-support
ii  apturl		ii  aview		ii  binutils
ii  apturl-common	ii  banshee		ii  bison
ii  archdetect-deb	ii  baobab		ii  blt
ii  aspell		ii  base-files		ii  blueberry
ii  aspell-en		ii  base-passwd		ii  bluetooth
ii  at-spi2-core	ii  bash		ii  bluez
ii  attr		ii  bash-completion	ii  bluez-cups
ii  avahi-autoipd	ii  bc			ii  bluez-obexd

.....

Os sinalizadores usados aqui são:

  1. --column define o número de colunas criadas na saída.
  2. -l especifica o comprimento da página (o padrão é 66 linhas).

10. Comando tr

Esta ferramenta traduz ou exclui caracteres da entrada padrão e grava os resultados na saída padrão.

A sintaxe para usar tr é a seguinte:

tr options set1 set2

Dê uma olhada nos exemplos abaixo, no primeiro comando, set1( [:upper:] ) representa o caso dos caracteres de entrada (todos maiúsculos).

Então set2([:lower:]) representa o caso em que estarão os caracteres resultantes. É a mesma coisa no segundo exemplo e a sequência de escape \n significa imprimir a saída em uma nova linha:

tecmint@TecMint ~ $ echo "WWW.TECMINT.COM" | tr [:upper:] [:lower:]
linux-console.net

tecmint@TecMint ~ $ echo "news.linux-console.net" | tr [:lower:] [:upper:]
NEWS.TECMINT.COM

11. mais Comando

O comando mais é um filtro útil de leitura de arquivos criado basicamente para visualização de certificados. Ele mostra o conteúdo do arquivo em formato de página, onde os usuários podem pressionar [Enter] para visualizar mais informações.

Você pode usá-lo para visualizar arquivos grandes como este:

tecmint@TecMint ~ $ dmesg | more
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 4.4.0-21-generic (buildd@lgw01-21) (gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2) ) #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 (Ubuntu 4.4.0-21.37-generic
 4.4.6)
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-21-generic root=UUID=bb29dda3-bdaa-4b39-86cf-4a6dc9634a1b ro quiet splash vt.handoff=7
[    0.000000] KERNEL supported cpus:
[    0.000000]   Intel GenuineIntel
[    0.000000]   AMD AuthenticAMD
[    0.000000]   Centaur CentaurHauls
[    0.000000] x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]:  256
[    0.000000] x86/fpu: Supporting XSAVE feature 0x01: 'x87 floating point registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x02: 'SSE registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x04: 'AVX registers'
[    0.000000] x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.
[    0.000000] x86/fpu: Using 'eager' FPU context switches.
[    0.000000] e820: BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009d3ff] usable
[    0.000000] BIOS-e820: [mem 0x000000000009d400-0x000000000009ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000a56affff] usable
[    0.000000] BIOS-e820: [mem 0x00000000a56b0000-0x00000000a5eaffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000a5eb0000-0x00000000aaabefff] usable
--More--

12. menos comando

menos é o oposto do comando mais acima, mas oferece recursos extras e é um pouco mais rápido com arquivos grandes.

Use-o da mesma forma que mais:

tecmint@TecMint ~ $ dmesg | less
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 4.4.0-21-generic (buildd@lgw01-21) (gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2) ) #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 (Ubuntu 4.4.0-21.37-generic
 4.4.6)
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-21-generic root=UUID=bb29dda3-bdaa-4b39-86cf-4a6dc9634a1b ro quiet splash vt.handoff=7
[    0.000000] KERNEL supported cpus:
[    0.000000]   Intel GenuineIntel
[    0.000000]   AMD AuthenticAMD
[    0.000000]   Centaur CentaurHauls
[    0.000000] x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]:  256
[    0.000000] x86/fpu: Supporting XSAVE feature 0x01: 'x87 floating point registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x02: 'SSE registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x04: 'AVX registers'
[    0.000000] x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.
[    0.000000] x86/fpu: Using 'eager' FPU context switches.
[    0.000000] e820: BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009d3ff] usable
[    0.000000] BIOS-e820: [mem 0x000000000009d400-0x000000000009ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000a56affff] usable
[    0.000000] BIOS-e820: [mem 0x00000000a56b0000-0x00000000a5eaffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000a5eb0000-0x00000000aaabefff] usable
:

Aprenda por que o comando ‘menos’ é mais rápido que ‘mais’ para uma navegação eficaz de arquivos no Linux.

Por enquanto é tudo, informe-nos sobre quaisquer ferramentas úteis de linha de comando não mencionadas aqui, que atuam como filtros de texto no Linux por meio da seção de comentários abaixo.