Como procurar uma palavra em um arquivo, mas também mostrar o arquivo inteiro junto com a palavra encontrada?

Como procurar uma palavra em um arquivo, mas também mostrar o arquivo inteiro junto com a palavra encontrada?

Estou usando o Ubuntu 16.04.

Quero pesquisar uma determinada palavra, mas também quero que todo o arquivo que contém a palavra seja exibido no terminal para que eu possa ver onde a palavra está localizada no arquivo. No entanto, quando eu uso grep, ele mostrará apenas a frase específica que contém a palavra, não o arquivo inteiro.

Que comando posso usar para pesquisar uma palavra, mas também mostrar o arquivo inteiro junto com o local onde a palavra está localizada?

Responder1

Com grepvocê pode usar:

$ grep -E -e 'pattern' -e '$' file

ou de forma simplificada:

$ grep -E 'pattern|$' file

Tecnicamente, isso também funcionaria:

$ grep -E 'pattern|^' file

ou ainda: grep -E 'pattern|' file. Diz linhas com patternou sem padrão. então tudo vai combinar.

Eu criei grepo alias de grep --color=always, então, se não fizer isso, você mesmo terá que passar a opção de cor.


Com less:

$ less -p 'pattern' file

Assim, o arquivo apareceria em menos espaço, o termo desejado seria destacado e você poderia usar ne shift+ npara alternar entre as correspondências.

Responder2

Editar: interpretei mal a pergunta na minha resposta original.... Editei-a para produzir o resultado desejado... Estava apenas mostrando o nome do arquivo na saída. Editei esta resposta para usar essa saída para mostrar o arquivo inteiro usando less (como sugere a resposta de Ravexina)
... além disso, isso retornará apenas os arquivos (in less) que foram correspondidos pelo grep ao pesquisar em um (s) diretório (s) ).
....e adicionei -Ipara ignorar arquivos binários, eles podem tornar a lessinteração confusa. Remova-o se precisar pesquisar arquivos binários ou arquivos que o grep possa "pensar" que são binários.

Use o sinalizador "with-filename" com grep para mostrar o arquivo. (a bandeira é -H)

Presumo que você esteja vasculhando um diretório e cada um dos arquivos nele contidos. Se estiver pesquisando fora do diretório atual, use *para evitar o erro "é um diretório" sem resultados.

grep -HI pattern /directory/* | less -p pattern $(awk -F ":" '{print $1}')

ou

grep --with-filename -I pattern /directory/* | less -p pattern $(awk -F ":" '{print $1}')

ou se detalhar em subdiretórios ...

grep -rHI pattern /directory/* | less -p pattern $(awk -F ":" '{print $1}')

Não gosto de inserir o padrão duas vezes, poderia ser melhorado

Responder3

Se você quiser ver onde está o texto pesquisado no arquivo, use o sinalizador C. Por exemplo:

grep -C 5 'MySearchText' *

mostrará a linha que contém o texto e cinco linhas antes e cinco linhas depois da pesquisa pretendida.

Responder4

Para complementar as outras respostas: você pode adicionar '-n' às opções para ver os números das linhas à esquerda:

grep -n -C 3  "something"  filename

mostrará linhas contendo "alguma coisa", com 3 linhas de "Contexto" (ou seja, 3 linhas antes e depois daquela(s) que corresponde(m) a "alguma coisa"), e cada linha mostrada terá seu número de linha anexado no início.

informação relacionada