Pesquisando e extraindo dados de arquivos
Resumo Conciso
Este tópico integra duas lições: a Lição 1 (redirecionamento de E/S e pipes) e a Lição 2 (grep e expressões regulares).
Canais padrão (stdin / stdout / stderr)
| Canal | Nome | Nº | Origem/Destino por defeito |
|---|---|---|---|
| stdin | entrada padrão | 0 | teclado |
| stdout | saída padrão | 1 | ecrã |
| stderr | erro padrão | 2 | ecrã |
Operadores de redirecionamento (Lição 1)
| Operador | Ação |
|---|---|
> | redireciona stdout para ficheiro (sobrescreve) |
>> | anexa stdout ao ficheiro |
2> | redireciona stderr (sobrescreve) |
2>> | anexa stderr |
&> | stdout + stderr (sobrescreve) |
&>> | anexa stdout + stderr |
< | entrada a partir de ficheiro |
<<DELIM | here document — bloco de texto até ao delimitador |
/dev/null— "bit bucket": descarta tudo o que lá for enviado (2> /dev/nullsilencia erros).- ⚠️
>sobrescreve sem avisar — usar>>para acrescentar.
Pipes (|)
A saída de um comando torna-se automaticamente a entrada do seguinte. Os comandos intermédios que transformam os dados chamam-se filtros. Encadeia-se livremente: cmd1 | cmd2 | cmd3.
Filtros e visualizadores (Lição 1)
| Comando | Função | Opções comuns |
|---|---|---|
cat | exibe/concatena ficheiros | — |
less / more | paginação (rolagem) | — |
head | primeiras 10 linhas | -n N (N linhas) |
tail | últimas 10 linhas | -n N; -f segue em tempo real |
cut | corta campos | -f N -d "delim" |
sort | ordena linhas | -r (reverso), -f (ignora maiúsculas) |
wc | conta linhas/palavras/bytes | -l / -w / -c |
tr | traduz/remove caracteres | -d (apaga) |
find | procura ficheiros | -name |
grep (Lição 2) — global regular expression print
Procura um padrão dentro de ficheiros e imprime as linhas correspondentes.
| Opção | Efeito |
|---|---|
-i | ignora maiúsculas/minúsculas |
-r | pesquisa recursiva (subdiretórios) |
-c | conta o nº de correspondências |
-v | inverte — linhas que NÃO correspondem |
-E | expressões regulares estendidas (+, ?, |) |
Expressões regulares — metacaracteres
| Metacaractere | Significado |
|---|---|
. | qualquer caractere (exceto nova linha) |
[abc] | um dos caracteres listados |
[^abc] | qualquer caractere exceto os listados |
[a-z] | intervalo de caracteres |
^ | início de linha |
$ | fim de linha |
a|b | OU (uma das strings) — exige -E |
* | zero ou mais do padrão anterior |
+ | um ou mais (ERE) |
? | zero ou um (ERE) |
- Em padrões complexos, usar aspas duplas (
"padrão") para o shell não interpretar os metacaracteres. - Diferença crucial:
grep "ab"procura a string literal "ab";grep "[ab]"procura qualquer linha comaoub.
🔬 Exercícios Exploratórios (prática no terminal)
Exercícios da autoria do agente. Consolidam o tópico 3.2 (redirecionamento, pipes,
grep, regex). Dica: trabalha em~/lab32. As soluções estão em<details>.
Exploratório 1 — Construir e filtrar um ficheiro de logs
Cria um ficheiro servicos.log com 4 linhas (níveis ERROR/WARN/OK) e usa grep para isolar os erros e para excluir os OK.
mkdir -p ~/lab32 && cd ~/lab32# Construir o ficheiro com here documentcat << 'EOF' > servicos.logERROR falha no discoWARN memoria altaOK servico ativoERROR rede instavelEOFcat servicos.log# Apenas erros (maiúsculas/minúsculas ignoradas)grep -i "error" servicos.log# Tudo exceto OKgrep -v "OK" servicos.logAprendido: o here document (<< 'EOF') escreve várias linhas num só comando sem editor. O grep -v inverte a seleção — útil para remover "ruído" dos logs.
Exploratório 2 — Pipeline: listar e contar utilizadores
Numa só linha, ordena os nomes de utilizador de /etc/passwd e conta-os. Depois, numa segunda linha, mostra os shells mais comuns por ordem decrescente (usa cut, sort, uniq -c).
# Contar utilizadores (campo 1, delimitador :)cut -d: -f1 /etc/passwd | sort | wc -l# Shells mais comuns (campo 7), com contagemcut -d: -f7 /etc/passwd | sort | uniq -c | sort -rn | headAprendido: encadeamento de filtros — cut extrai o campo → sort prepara iguais adjacentes → uniq -c agrupa e conta → sort -rn ordena por frequência → head limita. O : foi o delimitador de campo (-d:).
Exploratório 3 — Separar stdout e stderr em ficheiros diferentes
Executa um find em /etc à procura de *.conf, gravando os resultados num ficheiro e os erros noutro. Conta as linhas de cada um.
cd ~/lab32find /etc -name "*.conf" > achados.txt 2> erros.txt# Quantos resultados e quantos erros?wc -l achados.txt erros.txt# Descartar só os erros (silenciar)find /etc -name "*.conf" 2> /dev/null | wc -lAprendido: > envia o canal 1 (stdout) e 2> o canal 2 (stderr) para destinos diferentes. O /dev/null descarta os erros — prática comum para "limpar" a saída de comandos ruidosos.
Exploratório 4 — head, tail e cut combinados
Mostra as 3 primeiras linhas de /etc/passwd e, dessas, extrai apenas o nome de utilizador e a shell (campos 1 e 7).
head -n 3 /etc/passwd | cut -d: -f1,7Resultado esperado:
root:/bin/bashdaemon:/usr/sbin/nologinbin:/bin/shAprendido: cut -f1,7 seleciona vários campos separados por vírgula. O head limita o volume antes do cut atuar.
Exploratório 5 — Expressões regulares com grep
Sobre o /etc/passwd:
- Lista as linhas que começam por
rootoudaemon. - Conta quantos utilizadores têm
bashcomo shell (linha acaba em/bin/bash). - Mostra as linhas que não contêm nenhum algarismo.
# 1. Início root OU daemon (operador |, precisa de -E)grep -E "^(root|daemon)" /etc/passwd# 2. Contar shells que terminam em /bin/bashgrep -cE "/bin/bash$" /etc/passwd# 3. Linhas sem nenhum algarismo (intervalo negado)grep -v "[0-9]" /etc/passwd | headAprendido:
^(a|b)ancora o OU no início da linha.$ancora o fim;[0-9]é um intervalo de dígitos, e-vinverte para "linhas sem dígitos".- O
-Eé indispensável sempre que usares|,+ou?.