A combinação de diversos comandos por meio do operador de pipe (|) cria um pipeline, uma ferramenta poderosa no shell Linux. Os comandos utilizados dessa forma são comumente chamados de filtros. Um filtrro recebe dados de sua entrada padrão, os processa ou modifica de alguma maneira, e então envia o resultado para sua saída padrão. Essa característica permite encadear operações complexas de forma eficiente.
Em resumo, as principais características de um comando filtro são:
- Ele opera sobre dados recebidos da entrada padrão (
stdin). - Ele produz seu resultado na saída padrão (
stdout). - É frequentemente utilizado em conjunto com pipelines no Linux para transformar fluxos de dados.
A seguir, exploramos alguns dos comandos mais utilizados como filtros em pipelines.
- O Comendo
awk
O awk é uma linguagem de programação interpretada para processamento de texto, ideal para extração de dados e geração de relatórios. Ele processa arquivos linha por linha, permitindo manipulações complexas de campos.
# Lista os usuários do sistema com seus diretórios home, limitando aos 5 primeiros.
$ awk -F: '{print $1 " -> " $6}' /etc/passwd | head -n 5
# Calcula a porcentagem média de uso de disco para partições específicas.
$ df -h | grep -E '^/dev/' | awk '{sum+=$5} END {print "Uso médio do disco: " sum/NR "%"}' | sed 's/%//'
# Filtra e exibe as últimas 3 linhas de log que contêm "error" ou "fail".
$ cat /var/log/syslog | awk '/error|fail/ {print $0}' | tail -n 3
- O Comando
cut
O comando cut é usado para extrair seções específicas de cada linha de um arquivo de entrada (ou da entrada padrão), exibindo-as na saída padrão.
# Exibe os nomes e GIDs dos primeiros 5 grupos do sistema.
$ cut -d: -f1,3 /etc/group | head -n 5
# Obtém a versão principal do kernel.
$ uname -r | cut -d'.' -f1,2
# Lista apenas as permissões de arquivos regulares no diretório atual.
$ ls -l | cut -c 1-10 | grep '^-'
- O Comando
grep
O grep é uma ferramenta essencial para buscar linhas que correspondam a um padrão específico em um ou mais arquivos. É um dos filtros mais utilizados em pipelines.
# Encontra as últimas 5 linhas de log que contêm "warn" ou "error" (ignorando maiúsculas/minúsculas).
$ grep -iE "warn|error" /var/log/kern.log | tail -n 5
# Lista apenas os arquivos executáveis no diretório /usr/local/bin.
$ ls -l /usr/local/bin | grep '^-.*x'
# Busca entradas de login SSH falhas no log de autenticação.
$ grep "sshd" /var/log/auth.log | grep "Failed password"
- O Comando
tar
O tar é amplamente usado para arquivar e compactar arquivos. Em pipelines, ele pode ser usado para copiar ou mover estruturas de diretórios de forma eficiente.
# Copia a estrutura completa de um diretório web para um novo local temporário.
# O arquivo é criado na saída padrão e extraído na entrada padrão do segundo tar.
$ tar -cvf - /var/www/html | (cd /tmp/backup_web/; tar -xvf -)
# Migra o diretório home de um usuário antigo para um novo host via SSH.
$ tar -czf - /home/usuario_antigo | ssh novo_host "tar -xzf - -C /home/usuario_novo"
# Verifica o tamanho de um diretório quando arquivado (sem compactação).
$ tar -cf - /var/log/apt | wc -c
- O Comando
head
O head exibe as primeiras linhas de um arquivo ou da entrada padrão (por padrão, as 10 primeiras).
# Exibe as primeiras 7 linhas do log de inicialização do sistema.
$ cat /var/log/boot.log | head -n 7
# Mostra as primeiras 6 entradas da lista de processos (incluindo o cabeçalho).
$ ps aux | head -n 6
- O Comando
paste
O paste combina linhas de arquivos ou da entrada padrão, juntando-as horizontalmente.
# Cria arquivos temporários para demonstração
$ echo -e "maçã\nbanana\ncereja\ndamasceno\nelderberry" > frutas.txt
$ seq 1 5 > numeros.txt
# Combina as linhas dos arquivos frutas.txt e numeros.txt, separadas por vírgula.
$ paste -d',' frutas.txt numeros.txt
# Lista os 12 primeiros arquivos em /etc em 3 colunas, separados por '|'.
$ ls -1 /etc | head -n 12 | paste -d' | ' - - -
- O Comando
sed
O sed (stream editor) é um editor de fluxo usado para filtrar e transformar texto, permitindo substituições, exclusões e inserções com base em padrões.
# Substitui todas as ocorrências de "mundo" por "universo" em uma string.
$ echo "Olá mundo, mundo afora!" | sed 's/mundo/universo/g'
# Remove linhas de separação ("--") do final da saída do journalctl.
$ journalctl -n 10 | sed '/^--/d'
# Extrai hostnames de /etc/hosts, excluindo comentários e endereços locais.
$ grep -vE "^#|^127.0.0.1|^::1" /etc/hosts | sed 's/\s.*//'
- O Comando
sort
O sort organiza as linhas de um arquivo de texto ou da entrada padrão, geralmente em ordem alfabética ou numérica.
# Lista os arquivos em /tmp, ordenados pela data de modificação (do mais antigo para o mais recente).
$ ls -lt /tmp | sort -k6,7 | head -n 5
# Classifica as conexões de rede ativas pelo estado da conexão.
$ netstat -punta | tail -n +3 | sort -k6 | head -n 5
# Ordena uma lista de palavras alfabeticamente, ignorando maiúsculas e minúsculas.
$ echo -e "Apple\nbanana\nCherry" | sort -f
- O Comando
split
O split divide um arquivo (ou a entrada padrão) em pedaços menores, salvando-os com um prefixo especificado.
# Gera um arquivo grande para exemplo.
$ seq 1 100 > arquivo_grande.txt
# Divide a saída de um comando em arquivos, cada um com 10 linhas.
$ cat arquivo_grande.txt | split -l 10 - pedaco_
# Divide as primeiras 15 linhas de /etc/services em blocos de 3 linhas.
$ cat /etc/services | head -n 15 | split -l 3 - lista_servicos_
- O Comando
strings
O strings imprime as sequências de caracteres imprimíveis de um arquivo, sendo útil para extrair texto de arquivos binários.
# Extrai strings da biblioteca C padrão e filtra por "version".
$ strings /lib/x86_64-linux-gnu/libc.so.6 | grep "version"
# Busca por mensagens de "Error" em um binário como o Firefox.
$ strings /usr/bin/firefox | grep "Error"
# Lista strings com no mínimo 10 caracteres de um módulo do kernel.
$ strings -n 10 /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/intel/e1000e/e1000e.ko | head -n 5
- O Comando
tail
O tail exibe as últimas linhas de um arquivo ou da entrada padrão. É frequentemente usado para monitorar logs em tempo real com a opção -f.
# Exibe as últimas 5 entradas da saída do comando dmesg.
$ dmesg | tail -n 5
# Mostra os 5 usuários que fizeram login mais recentemente.
$ last | tail -n 5
# Encontra o processo com maior uso de memória (ignorando o cabeçalho).
$ ps aux --sort=-%mem | head -n 2 | tail -n 1
- O Comando
tee
O tee lê da entrada padrão e escreve na saída padrão, mas também redireciona uma cópia dessa saída para um ou mais arquivos. É útil para capturar resultados intermediários em um pipeline.
# Lista usuários logados e salva a saída em um arquivo, exibindo-a também na tela.
$ who | grep "pts" | tee sessoes_ssh_ativas.log
# Atualiza os pacotes APT, salva a saída completa e depois filtra os pacotes instalados em outro arquivo.
$ sudo apt update | tee apt_saida_completa.log | grep "Inst" | tee apt_pacotes_instalados.log
# Adiciona a informação de tempo de atividade do sistema a um arquivo de log diário.
$ uptime | tee -a /var/log/status_sistema_diario.log
# Envia a saída de 'free -h' para dois arquivos distintos: um diário e um relatório semanal.
$ free -h | tee /tmp/relatorio_mem_diario.log /tmp/relatorio_sem_mem.txt
- O Comando
tr
O tr é usado para traduzir ou deletar caracteres de um fluxo de texto.
# Converte todos os caracteres de nova linha em espaços.
$ ls -1 | tr '\n' ' '
# Remove todas as vogais de uma string (maiúsculas e minúsculas).
$ echo "Hello World" | tr -d 'aeiouAEIOU'
# Converte todos os caracteres em maiúsculas para minúsculas.
$ echo "LINUX É FANTÁSTICO" | tr '[:upper:]' '[:lower:]'
# Compacta múltiplos espaços consecutivos em um único espaço.
$ echo "Este texto tem muitos espaços" | tr -s ' '
- O Comando
uniq
O uniq reporta ou remove linhas duplicadas adjacentes em um fluxo de texto. Para remover todas as duplicatas, o input deve ser previamente ordenado.
# Lista os shells únicos usados pelos usuários do sistema.
$ cut -d: -f7 /etc/passwd | sort | uniq
# Conta as ocorrências de cada palavra única em uma lista simples.
$ echo -e "maçã\nbanana\nmaçã\nlaranja\nbanana" | sort | uniq -c
# Remove linhas duplicadas consecutivas da saída do dmesg.
$ dmesg | uniq
- O Comando
wc
O wc (word count) é usado para contar linhas, palavras e caracteres em arquivos ou na entrada padrão.
# Conta o número de linhas no arquivo /etc/fstab.
$ cat /etc/fstab | wc -l
# Conta o número de palavras no log de inicialização do sistema.
$ cat /var/log/boot.log | wc -w
# Conta o número de caracteres no arquivo de configuração de resolução de DNS.
$ cat /etc/resolv.conf | wc -m
# Conta o número de arquivos e diretórios no diretório atual.
$ ls -1 | wc -l