Mostra o nome do arquivo e o número da linha na saída grep

87

Estou tentando pesquisar meu diretório rails usando grep. Estou procurando uma palavra específica e quero usar o grep para imprimir o nome do arquivo e o número da linha.

Existe um sinalizador grep que fará isso por mim? Tenho tentado usar uma combinação de -ne, -lmas esses estão imprimindo os nomes dos arquivos sem números ou apenas despejando um monte de texto no terminal que não pode ser lido facilmente.

ex:

  grep -ln "search" *

Eu preciso canalizar para awk?

trev9065
fonte

Respostas:

138

Acho que -lé muito restritivo, pois suprime a saída de -n. Eu sugeriria -H( --with-filename): Imprima o nome do arquivo para cada correspondência.

grep -Hn "search" *

Se isso der saída demais, tente -oimprimir apenas a parte que corresponde.

grep -nHo "search" * 
spokeadoke
fonte
Essa resposta funcionou também para mim. Eu precisava pesquisar recursivamente e usei este comando de exemplo: grep -Hnor "localhost". Esta lista contém todas as correspondências com o nome do arquivo e o número da linha, curta e concisa.
Rasgou Aurstad de
Isso também exibe o resultado e não apenas o nome do arquivo e o número da linha
elegível para
30
grep -rin searchstring * | cut -d: -f1-2

Isso diria, pesquisa recursivamente (para a string searchstringneste exemplo), ignorando maiúsculas e minúsculas e exibindo números de linha. A saída desse grep será semelhante a:

/path/to/result/file.name:100: Line in file where 'searchstring' is found.

Em seguida, canalizamos esse resultado para o comando cut usando dois pontos :como nosso delimitador de campo e exibindo os campos de 1 a 2.

Quando não preciso dos números de linha, costumo usar -f1(apenas o nome do arquivo e o caminho) e, em seguida, canalizar a saída para uniq, de modo que eu só veja cada nome de arquivo uma vez:

grep -ir searchstring * | cut -d: -f1 | uniq
JBW
fonte
1
Acho que isso responde melhor à pergunta original. Nomes de arquivos e números de linha apenas.
mastaBlasta
1
Observe que isso não funciona se você tiver nomes de caminho absolutos do Windows como `C: \ Users \ me \ git`, pois já contém dois pontos.
hirse de
19

Eu gosto de usar:

grep -niro 'searchstring' <path>

Mas isso é porque eu sempre esqueço as outras formas e não consigo esquecer Robert de grep -niro por algum motivo :)

Bas van Ommen
fonte
Nunca pensei que conseguiria votos positivos para o acima. Apenas um compartilhamento divertido. Obrigado! (Mas realmente funciona - pelo menos no MacOS)
Bas van Ommen
Ame a sua maneira de lembrar disso!
Greg Hilston
0

O comentário de @ToreAurstad pode ser escrito grep -Horn 'search' ./, o que é mais fácil de lembrar.

grep -HEroine 'search' ./ também pode funcionar;)

Para os curiosos:

$ grep --help | grep -Ee '-(H|E|r|o|i|n|e),'
  -E, --extended-regexp     PATTERNS are extended regular expressions
  -e, --regexp=PATTERNS     use PATTERNS for matching
  -i, --ignore-case         ignore case distinctions
  -n, --line-number         print line number with output lines
  -H, --with-filename       print file name with output lines
  -o, --only-matching       show only nonempty parts of lines that match
  -r, --recursive           like --directories=recurse
Ictus
fonte
0

Veja como usei a resposta votada para pesquisar em uma árvore os arquivos fortran contendo uma string:

find . -name "*.f" -exec grep -nHo the_string {} \;

Sem o nHo, você aprende apenas que algum arquivo, em algum lugar, corresponde à string.

Karl I.
fonte