Como realizar pesquisa de padrões em arquivos usando Grep
Nesta página
- Pesquisa que não diferencia maiúsculas de minúsculas com Grep
- Exibe certas linhas não correspondentes com a linha contendo a string correspondente no Grep
- Apenas imprimir strings correspondentes no Grep
- Mostrar posição no Grep
- Conclusão
Em nosso primeiro artigo sobre o comando grep, abordamos alguns recursos que a ferramenta oferece, incluindo como você pode usá-la para pesquisar apenas palavras, pesquisar duas palavras, contar linhas contendo a palavra correspondente e muito mais. Além disso, a ferramenta oferece alguns recursos mais fáceis de entender e úteis. Neste artigo, discutiremos alguns deles.
Observe que todos os exemplos mencionados neste tutorial foram testados no Ubuntu 14.04LTS. Além disso, usaremos o seguinte arquivo (test_file1.txt) para todos os nossos exemplos relacionados ao grep neste tutorial:
Pesquisa sem distinção entre maiúsculas e minúsculas com Grep
Por padrão, grep diferencia maiúsculas de minúsculas, o que significa, por exemplo, que tratará ABC e abc separadamente. No entanto, se você deseja que sua pesquisa não diferencie maiúsculas de minúsculas, você pode usar a opção de linha de comando -i.
grep -i [string-to-be-searched] [filename]
Por exemplo:
grep -i "linux" test_file1.txt
Observação: não apenas o padrão (por exemplo, linux no exemplo acima), a página de manual do grep diz que a opção -i também garante que a diferenciação de maiúsculas e minúsculas para arquivos de entrada também seja ignorada. Aqui está o trecho:
-i, --ignore-case
Ignore case distinctions in both the PATTERN and the input files. (-i is specified by POSIX.)
No entanto, não foi possível reproduzir o comportamento relacionado aos arquivos de entrada de nossa parte.
Exibir certas linhas não correspondentes com a linha contendo a string correspondente no Grep
Usando a ferramenta, você também pode exibir um número especificado de linhas depois, antes ou ao redor da linha que contém a string correspondente.
Use a opção de linha de comando -A para imprimir N linhas após a linha correspondente.
$ grep -A N [string-to-be-searched] [filename]
Por exemplo:
$ grep -A 2 "linux" test_file1.txt
Aqui está a saída do comando acima
Da mesma forma, a opção de linha de comando -B é usada para exibir linhas antes da linha correspondente.
$ grep -B N [string-to-be-searched] [filename]
Por exemplo:
$ grep -B 2 "linux" test_file1.txt
Aqui está a saída:
Por fim, para imprimir linhas ao redor da linha correspondente, use a opção de linha de comando -C.
$ grep -C N [string-to-be-searched] [filename]
Por exemplo:
$ grep -C 2 "linux" test_file1.txt
Aqui está a saída capturada:
Imprimir apenas strings correspondentes no Grep
Você também tem permissão para imprimir apenas a string correspondente na saída padrão (em vez de linhas completas que são exibidas por padrão). Esse recurso pode ser acessado usando a opção de linha de comando -o.
$ grep -o [string-to-be-searched] [filename]
Por exemplo, se o requisito for pesquisar uma string \linux\ em um arquivo (mas linhas completas não devem ser impressas), usaremos o seguinte comando.
$ grep -o "linux" [file-name]
Também podemos usar caracteres curinga como * e .* para grep em mais de uma string. Por exemplo, se quisermos grep um grupo de palavras começando em \como\ e terminando em \linux\, podemos usar o seguinte comando.
$ grep -o “how.*linux” [file-name]
Posição de exibição no Grep
O comando grep também permite que você exiba o deslocamento de byte da linha na qual ocorre a string correspondente. Esse recurso pode ser acessado usando a opção de linha de comando -b. Mas para um melhor uso desta opção, você pode usá-la com a opção de linha de comando -o, que exibirá a posição exata da string correspondente.
$ grep -o -b [string-to-be-searched] [filename]
Por exemplo:
$ grep -o -b "for" test_file1.txt
Aqui está a saída:
Conclusão
Você pode não precisar de todas essas opções todos os dias, mas pelo menos deve conhecê-las, pois nunca sabe quando elas podem ser úteis. Grep se torna ainda mais poderoso quando usado com expressão regular, mas deixaremos esse tópico para outro dia.