Como posso pesquisar recursivamente diretórios para um padrão e apenas imprimir nomes de arquivos e números de linhas

7

Atualmente estou usando o grep da seguinte forma:

grep -lr <PATTERN> .

Isso me dá a seguinte saída, contendo uma lista de todos os arquivos cujo conteúdo (e não nome) contém:

./path/to/file1
./path/to/file2
...

Tudo bem, mas saber que os números de linha seriam úteis. A seguinte saída seria ideal, mas tendo passado pela man page do grep, não consigo descobrir os switches certos:

./path/to/file1 15, 22, 54
./path/to/file2 16, 17
...

Isso é possível com grep ou alguma outra ferramenta?

    
por Rupert Madden-Abbott 13.04.2011 / 04:44

5 respostas

5

ack faz algo semelhante por padrão. você pode usar

$ ack blah
path/to/blah
16: blah blah
19: blah blah blah

path/to/more/blah
21: blahness

Se você quiser apenas os nomes dos arquivos correspondentes, poderá dizer ack -l . ack -lc fornecerá o número de correspondências por arquivo.

    
por 13.04.2011 / 05:49
2

O grep tem opções para imprimir apenas nomes de arquivos, ou apenas nomes de arquivos e contagens de correspondência, ou linhas correspondentes (possivelmente com nomes de arquivos e números de linhas), mas não para condensar várias correspondências em uma linha.

Você pode filtrar a saída do grep ou usar outra ferramenta, como o awk.

find . -type f -exec awk 'FNR==1 {if (found) print ""; found=0}
                          /PATTERN/ { if (!found) printf("%s", FILENAME);
                                      printf(" %d", FNR);
                                      found=1 }
                          END {if (found) print ""}' {} +
    
por 13.04.2011 / 21:45
1
grep -rins <pattern> *

Isso faz o que você está procurando?

Caso você tenha um padrão mais complexo, por exemplo, ao usar egrep , talvez seja útil usar egrep -rinos <pattern> * .

Para aumentar ainda mais a legibilidade, adicione --color à lista de parâmetros. Pessoalmente, tenho isso no meu .zshrc :

export GREP_OPTIONS="--color"
    
por 13.04.2011 / 05:37
0

se você quiser pesquisar uma árvore completa, tente

find . -exec grep -n blah  {} /; -ls  

ou similar

find . -exec grep -n blah {} /; -print
    
por 14.04.2011 / 14:44
0
A tag grep do -H inclui o nome do arquivo, a tag grep 'n imprime o número da linha. Se você quiser listar apenas a primeira correspondência e o nome do arquivo, use -l .
Para excluir informações adicionais, você poderia canalizar para sed ao obter o número da linha e o nome do arquivo que você poderia canalizar para sed .

    
por 14.08.2011 / 01:12

Tags