Informática

Linux: pipes, redirecionamento, grep e find com saídas conferidas

A força do terminal Linux está em combinar comandos pequenos: um produz texto, outro filtra, outro conta. As bancas cobram o efeito de linhas como sort arquivo | uniq -c ou a diferença entre > e >>. Os comandos abaixo foram executados em um terminal de teste com arquivos criados para o exemplo, e as saídas são as obtidas.

Arquivos de teste

nomes.txt (7 linhas): ana, bruno, carla, ana, diego, bruno, ana, uma por linha.

log.txt (5 linhas):

erro: disco
aviso: cpu
erro: rede
ok
erro: disco

Três fluxos padrão

Todo programa tem três canais:

Canal Número Padrão
stdin (entrada) 0 teclado
stdout (saída) 1 tela
stderr (erros) 2 tela

Redirecionamento

  • > envia a saída a um arquivo, substituindo o conteúdo.
  • >> acrescenta ao final.
  • < lê a entrada de um arquivo.
  • 2> redireciona os erros.

Teste: echo um > r.txt e depois echo dois > r.txt deixou o arquivo com uma única linha, “dois”. Com echo tres >> r.txt, o arquivo ficou com “dois” e “tres”. Moral: > apaga o que havia, e é o erro mais comum de quem quer anexar.

Para erros: ls naoexiste 2> err.txt guardou no arquivo a mensagem de erro (arquivo ou diretório inexistente) em vez de mostrá-la. A forma comando > /dev/null 2>&1 descarta saída e erros; /dev/null é um “buraco negro” do sistema.

Pipe (|)

O pipe liga a saída de um comando à entrada do seguinte, sem arquivo intermediário. Os comandos do pipe rodam em conjunto, passando dados em fluxo.

Filtros que você precisa conhecer

Comando Função
cat exibe o conteúdo
head -n 2 / tail -n 2 primeiras / últimas 2 linhas
sort ordena linhas
uniq remove linhas consecutivas repetidas
uniq -c idem, e conta as repetições
wc -l / wc -w conta linhas / palavras
grep filtra linhas que casam com um padrão
cut -d: -f2 corta campos por delimitador

Resultados do teste:

  • head -n 2 nomes.txt mostrou ana e bruno; tail -n 2 nomes.txt mostrou bruno e ana.
  • wc -l nomes.txt deu 7 linhas; wc -w log.txt deu 9 palavras.
  • echo "a:b:c" | cut -d: -f2 devolveu b.

Contando repetições: a pegadinha do sort

sort nomes.txt | uniq -c produziu:

Contagem Nome
3 ana
2 bruno
1 carla
1 diego

Já uniq nomes.txt | wc -l, sem ordenar antes, deu 7, pois não há duas linhas seguidas iguais, e o uniq só remove repetições adjacentes. Por isso quase sempre se usa sort antes de uniq. Para ordenar do mais frequente ao menos frequente, acrescenta-se sort -rn (-n numérico, -r inverso): sort nomes.txt | uniq -c | sort -rn colocou ana (3) em primeiro e bruno (2) em segundo; a ordem entre contagens empatadas não é garantida por esse comando.

grep

grep padrão arquivo imprime as linhas que contêm o padrão.

Comando em log.txt Resultado
grep erro log.txt as três linhas com erro (disco, rede, disco)
grep -c erro log.txt 3 (contagem de linhas)
grep -v erro log.txt as linhas sem erro: “aviso: cpu” e “ok”
grep -n DISCO log.txt nada (diferencia maiúsculas)
grep -in DISCO log.txt linhas 1 e 5, com números (-i ignora caixa, -n numera)

O grep aceita expressões regulares básicas: ^erro casa linhas que começam com “erro”, e disco$ as que terminam em “disco”. Opções frequentes: -r (recursivo em diretórios), -l (só nomes dos arquivos que casam), -w (palavra inteira).

find

find percorre diretórios procurando por nome, tipo, tamanho ou data. Diretório de teste: docs/a.txt, docs/sub/b.txt, docs/sub/c.log.

  • find docs -name "*.txt" achou docs/a.txt e docs/sub/b.txt, e deixou de fora c.log. As aspas evitam que o interpretador expanda o curinga antes do find.
  • find docs -type d listou os diretórios: docs e docs/sub. Tipo f é arquivo comum.

Outras opções: -size, -mtime (data de modificação) e -exec para rodar um comando em cada resultado. Diferença cobrada: find percorre a árvore de diretórios; grep busca dentro do conteúdo dos arquivos; locate consulta um índice pronto, mais rápido, porém desatualizável.

Encadeamento com && e ||

  • a && b: executa b só se a teve sucesso (código de saída 0).
  • a || b: executa b só se a falhou.

No teste, true && echo A imprimiu A; false && echo B não imprimiu nada; false || echo C imprimiu C. Em Linux, código 0 significa sucesso; qualquer outro, falha. Um ls de arquivo inexistente devolveu o código 2.

Leitura passo a passo de um pipeline

grep erro log.txt | sort | uniq -c:

  1. O grep entrega as três linhas de erro.
  2. O sort as ordena: as duas “erro: disco” ficam juntas.
  3. O uniq -c conta: 2 de “erro: disco” e 1 de “erro: rede”.

Erros comuns

  • Usar > achando que acrescenta.
  • Aplicar uniq sem sort.
  • Esquecer que o grep diferencia maiúsculas sem -i.
  • Confundir find (arquivos pelo nome e atributos) com grep (conteúdo).
  • Achar que | e > são equivalentes: o pipe liga comandos; o > grava em arquivo.

Fontes e atualização

Não há norma oficial brasileira sobre comandos Linux; o conteúdo segue o padrão POSIX e a prática dos utilitários GNU, e as saídas foram obtidas executando os comandos em um terminal de teste. Opções e saídas variam entre versões e distribuições: confira o edital e a documentação (man) do sistema adotado.

Próximos passos

Leia também

Para continuar no site

Viu algo errado, desatualizado ou confuso? Relatar erro nesta página