Pipes e Redirecionamento: Entendendo o Fluxo de Dados no Linux

Pipes e Redirecionamento: Entendendo o Fluxo de Dados no Linux

O Que Voce Vai Aprender

  • O conceito de "fluxo de dados" no Linux
  • A diferenca entre | (pipe) e > >> (redirecionamento)
  • Como lidar com stdout e stderr separadamente
  • Como combinar grep, sort e outras ferramentas encadeando pequenos comandos

Resumo Rapido

  • Quer salvar a saida em um arquivo --> > >>
  • Quer passar a saida para outro comando --> |
  • Quer tratar erros separadamente --> 2>

1. De Onde Vem e Para Onde Vai o Dado?

Conclusao: Um comando Linux tem tres canais: stdin, stdout e stderr.

Lina: Senpai, quando eu rodo ls, os nomes dos arquivos aparecem na tela. De onde exatamente eles estao vindo?
Veterano Linny: Otima pergunta. Todo comando Linux tem tres "canais": entrada, saida e erro.
Veterano Linny: Entrada (entrada padrao / stdin) --> comando --> saida (stdout) + erro (stderr).
Lina: Entao entrada e saida sao canais separados?
Veterano Linny: Certo. E aqui esta a ideia principal: esses canais podem ser redirecionados. Voce pode enviar o que normalmente vai para a tela para um arquivo, ou passa-lo para outro comando. Esse e o tema de hoje.

Os 3 fluxos padrao

Nome Abreviacao Numero Destino padrao
Entrada padrao stdin 0 Teclado
Saida padrao stdout 1 Tela
Erro padrao stderr 2 Tela

2. Redirecionamento: Salvar Saida em um Arquivo

Conclusao: Use > para sobrescrever um arquivo e >> para adicionar com seguranca.

2-1. > -- Sobrescrever

$ ls > files.txt
Lina: Nada apareceu na tela... falhou?
Veterano Linny: Funcionou. > redirecionou a saida para um arquivo em vez da tela, entao nada aparece. Verifique o arquivo.
$ cat files.txt
Documents
Downloads
files.txt
Pictures

2-2. >> -- Adicionar

$ echo "line 1" > log.txt
$ echo "line 2" >> log.txt
$ cat log.txt
line 1
line 2

> trunca o arquivo existente antes de escrever. Usar > em um arquivo importante apagara seu conteudo. Sempre use >> quando quiser adicionar.

2-3. < -- Ler Entrada de um Arquivo (avancado)

$ wc -l < log.txt
2
Lina: Qual a diferenca disso para wc -l log.txt?
Veterano Linny: O resultado e quase o mesmo, mas o nome do arquivo nao e passado como argumento ao comando. < e "fornecer este arquivo no lugar do teclado." Por enquanto, dominar > e >> e suficiente.

3. Pipe: Conectar Comandos

Conclusao: | envia a saida de um comando como entrada para o proximo comando.

3-1. O Basico

| (barra vertical, "pipe") significa "enviar a saida do comando da esquerda como entrada do comando da direita."

$ ls | wc -l
12
Lina: Entao a saida de ls e enviada para wc -l para contar arquivos!
Veterano Linny: Exatamente. Esse e o poder dos pipes. Voce nao precisa de um comando gigante -- voce encadeia pequenos comandos especializados para alcancar seu objetivo. Esse e o jeito Linux.

3-2. Combinacoes Comuns

# Filtrar lista de arquivos para apenas os que contem ".txt"
$ ls | grep .txt

# Mostrar processos relacionados ao nginx
$ ps aux | grep nginx

# Ordenar o log de acesso em ordem reversa e mostrar as 10 linhas mais recentes
$ cat access.log | sort -r | head -n 10

Pipes podem encadear quantos comandos voce quiser

$ cmd1 | cmd2 | cmd3 | ...

O truque e dar a cada estagio um papel claro: filtrar, ordenar, formatar.

4. Pipe vs Redirecionamento

Conclusao: > salva a saida em um arquivo; | passa para um comando.

Lina: Ambos parecem enviar a saida para algum lugar. Qual a diferenca entre > e |?
Veterano Linny: O destino e diferente. Aqui esta um diagrama.

> vs |

cmd > file    -->  destino e um [arquivo]
cmd | cmd2    -->  destino e [stdin do proximo comando]
  • >: quando voce quer salvar
  • |: quando voce quer processar mais
# Padrao A: salvar saida de ls em um arquivo
$ ls > list.txt

# Padrao B: filtrar saida de ls atraves do grep
$ ls | grep ".log"

# Padrao C: combinar -- filtrar, depois salvar
$ ls | grep ".log" > log-files.txt

"Encadear com |, depois salvar o resultado com >" e o padrao mais comum no mundo real.

5. Lidando com Erro Padrao (stderr)

Conclusao: Erros usam stderr; separe com 2>, combine com 2>&1.

5-1. Erros Vem de um Canal Diferente

$ ls /not-exist > out.txt
ls: cannot access '/not-exist': No such file or directory
Lina: Espera, eu enviei tudo para out.txt, mas o erro ainda aparece na tela!
Veterano Linny: Isso e porque erros fluem pelo stderr, e > so redireciona stdout. Para capturar erros, use o numero 2.

5-2. Enviar Erros para um Arquivo Separado

$ ls /not-exist 2> error.log
(nada na tela)
$ cat error.log
ls: cannot access '/not-exist': No such file or directory

5-3. Combinar stdout e stderr em Um Unico Arquivo

$ command > all.log 2>&1

O que 2>&1 significa

"Enviar stderr (2) para o mesmo lugar que stdout (1)." Esse padrao esta em todo lugar na coleta de logs -- memorize a forma.

A ordem importa. > all.log 2>&1 esta correto; 2>&1 > all.log nao captura stderr em all.log (stderr vai para onde stdout estava apontando antes do redirecionamento).

6. Armadilhas Comuns para Iniciantes

Conclusao: Nunca redirecione um arquivo para ele mesmo; use tee no meio do pipe.

6-1. Usar > Apagou Meu Arquivo

$ cat important.txt > important.txt   # RUIM: arquivo fica vazio

> trunca o arquivo de destino antes que o comando execute. Entao cat le um arquivo ja vazio. Nunca redirecione a saida de um comando de volta para o mesmo arquivo que ele le.

6-2. Preciso de Espacos ao Redor de |?

Ambos funcionam. Adicionar espacos e a convencao para legibilidade.

$ ls|grep txt       # funciona, mas dificil de ler
$ ls | grep txt     # recomendado

6-3. Quero Ver a Saida Intermediaria do Pipe

$ ls | tee list.txt | wc -l

tee grava o que esta fluindo em um arquivo enquanto passa adiante. Util para depuracao ou para manter um snapshot dos resultados intermediarios.

7. Mini Exercicios

Conclusao: Tres exercicios: salvar, contar e filtrar-e-salvar saida.

Lina: Entendi a teoria! Quero tentar de verdade.
Veterano Linny: Aqui estao tres exercicios. Tente-os no seu terminal.

Exercicio 1: Salve a lista de arquivos do seu diretorio home em home-files.txt.

Mostrar dica

Use > para redirecionar a saida para um arquivo.

Mostrar resposta
$ ls ~ > home-files.txt

Exercicio 2: Conte quantas entradas existem em /etc e imprima a contagem na tela (use um pipe).

Mostrar dica

Passe a saida de ls para wc -l.

Mostrar resposta
$ ls /etc | wc -l

Exercicio 3: De /etc, extraia apenas arquivos terminando em .conf e salve-os em conf-list.txt.

Mostrar dica

Combine ls --> grep --> >.

Mostrar resposta
$ ls /etc | grep "\.conf$" > conf-list.txt

O $ em grep "\.conf$" e uma ancora regex que significa "fim da linha", entao apenas nomes de arquivo terminando com .conf sobrevivem.

8. Templates para Copiar e Colar

Conclusao: Mantenha formas prontas: salvar, adicionar, filtrar e capturar logs.

Padroes para ter a mao

# Salvar saida em um arquivo (sobrescrever)
command > out.txt

# Adicionar saida a um arquivo
command >> out.txt

# Filtrar saida
command | grep keyword

# Ordenar e pegar as 10 primeiras linhas
command | sort | head -n 10

# Capturar stdout e stderr em um arquivo
command > all.log 2>&1

# Capturar apenas erros
command 2> error.log

# Salvar saida intermediaria E manter o pipe fluindo
command | tee progress.txt | next-command

Resumo: O Que Ler em Seguida

Continue Sua Jornada LPIC-1

Hub LPIC-1

  • Hub de Aprendizado LPIC-1 -- Mapa completo de artigos LPIC-1, acompanhamento de progresso e cobertura dos objetivos do exame

Artigos LPIC-1 Relacionados

Pratica