linux.playground

trilha / arco 2 · mexer em arquivo

o que é grep e o que ele faz

o log tem 40 mil linhas e você precisa de uma. você não vai ler. você vai perguntar: em qual linha aparece essa palavra?

em poucos minutos: o que o grep faz, as quatro opções que mudam tudo, e o filtro invertido que apaga o que não devia. a pílula fica no final.

o vídeo desta aula sai em breve.
a aula já funciona: lê, treina no terminal e faz o quiz.

escolhe a camada

em uma frase

é passar um marca-texto numa pilha de papel. só as linhas com a palavra ficam coloridas, e o resto vai para o lixo.

para quem está começando

lê linha por linha e mostra as que contêm o texto que você procurou. se nenhuma tem, não mostra nada.

a fonte da verdade

o grep lê o arquivo (ou o que chega pelo pipe) linha por linha e compara cada uma com o padrão. o código de saída é a resposta para o shell: 0 achou, 1 não achou, 2 erro.

o número por trás do nome

0, 1 e 2: achou, não achou, deu erro. o 1 não é falha do grep, é o jeito de dizer que não tem. num script com set -e, esse 1 derruba o script.

agora você

terminal fechado

um linux de verdade, só seu, apagado quando você sai.

  1. procura erro no servidor.log, do jeito mais simples.

    grep erro servidor.log

  2. ignora maiúscula e minúscula, e mostra o número de cada linha.

    grep -in erro servidor.log

  3. procura TOKEN em toda a pasta projeto, entrando nas subpastas, mostrando número e arquivo.

    grep -rn TOKEN projeto

  4. repete a busca sem o .git e sem arquivos binários.

    grep -rnI --exclude-dir=.git TOKEN projeto

  5. procura uma palavra que não existe no log e pergunta o código de saída com echo $?. qual número vem?

  6. mostra as linhas do log que NÃO contêm INFO.

    grep -v INFO servidor.log

cuidado: grep -v com padrão errado deixa tudo passar

o arquivo ~/limpar.sh apaga tudo da pasta ~/dados, menos os backups, que terminam em .bak. ele lista os arquivos e passa por grep -v bakk. só que o padrão está com uma letra a mais. o -v tira só o que casa com bakk, e nenhum arquivo casa. passa tudo, e o xargs rm apaga tudo, backups inclusive. passo 1: antes de apagar, confira. rode ls ~/dados | grep -v bakk e veja a lista. os backups estão nela. não rode o ~/limpar.sh ainda. passo 2: conserte o script. abra com nano ~/limpar.sh. para salvar: ctrl+o e enter. para sair: ctrl+x. passo 3: teste. rode ~/limpar.sh e confira com ls ~/dados que só os .bak ficaram. se algo sair errado, digite restaurar-dados.

a pílula

grep -in padrão arquivoignora maiúscula, mostra a linha
grep -rnI --exclude-dir=.git padrão .busca na pasta, sem ruído
grep -v padrãomostra o que NÃO casa

com grep -v, confere antes de apagar.

quiz

1. grep erro log mostra uma linha, mas o log tem ERRO e erro. por quê?
2. grep palavra arquivo não achou nada. qual o código de saída?
3. ls | grep -v bakk | xargs rm, e os backups terminam em .bak. o que acontece?

próxima: o que é diff e o que ele faz