
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 grep
você 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 pattern
ou sem padrão. então tudo vai combinar.
Eu criei grep
o 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 -I
para ignorar arquivos binários, eles podem tornar a less
interaçã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.