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 -n
e, -l
mas 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?
Respostas:
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
-o
imprimir apenas a parte que corresponde.grep -nHo "search" *
fonte
grep -rin searchstring * | cut -d: -f1-2
Isso diria, pesquisa recursivamente (para a string
searchstring
neste 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 parauniq
, de modo que eu só veja cada nome de arquivo uma vez:grep -ir searchstring * | cut -d: -f1 | uniq
fonte
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 :)fonte
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
fonte
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.
fonte