Como uso o grep para pesquisar no diretório atual todos os arquivos com a sequência "olá", mas exibindo apenas arquivos .h e .cc?

138

Como uso o grep para pesquisar no diretório atual todos os arquivos que contêm a string "hello" e exibir apenas os arquivos .h e .cc?

stackoverflow
fonte

Respostas:

161
grep -r --include=*.{cc,h} "hello" .

É exibido: procure recursivamente (em todos os subdiretórios também) por todos os arquivos .cc OU .h que contenham "hello" neste .diretório (atual)

De outra pergunta de stackoverflow

stackoverflow
fonte
5
Na postagem original, você disse "diretório atual" e nada sobre precisar recursivamente ou em subdiretórios (eu sei que você mencionou isso em uma postagem posterior). Para aqueles interessados ​​em como fazê-lo apenas no diretório atual, é grep -si "hello" --include=*.{cc,h} ./* ./.*(também busca arquivos ocultos). Aqui está uma versão genérica para procurar uma string em todos os / arquivos ocultos: grep -s "hello" * .*. Talvez mais geralmente útil (e mais simples), essa pesquisa todos os arquivos não-escondida para "Olá": grep -si "hello" ./* Graças a este post: askubuntu.com/a/777456
jbobbins
1
grep -r --include=*.{java,py} "hello" .
Por alguma razão, isso não funciona no macOS, mesmo ao usar o utilitário GNU grep.
xApple 7/07
49

Você pode passar caracteres curinga em vez de especificar nomes de arquivos ou usar stdin.

grep hello *.h *.cc
Donald Miner
fonte
Eu preciso de todos os subdiretórios também
stackoverflow
A adição -Rnão funciona infelizmente. Expande o *antes de ir recursivamente.
Donald Miner
A resposta de Noufal é o que você está procurando, se você precisa subdiretórios
Donald Miner
8
@ Jammin Você deve ser claro sobre isso ao fazer a pergunta. Esta resposta é a resposta "correta" para sua pergunta declarada.
jordanm
$ grep -R hello *# find de toda a palavra contém hello (incluindo subdiretório)
19

find . -name \*.cc -print0 -or -name \*.h -print0 | xargs -0 grep "hello".

Verifique as páginas do manual para finde xargspara detalhes.

Noufal Ibrahim
fonte
1
Você deve ter um -print0após o '*.cc'caso contrário, não terá uma ação para essa parte da pesquisa. Ou você tem que inserir parênteses lá: find . \( -name '*.cc' -or -name '*.h' \) -print0.
Jonathan Leffler
Obrigado por perceber isso. Eu editei a resposta para "corrigi-lo".
Noufal Ibrahim
3
Você também pode usar a find -exec +sintaxe em vez de xargs
jordanm
@jordanm: Sim: -exec grep "hello" {} +onde o par de chaves representa o (s) nome (s) do arquivo. Boa sugestão.
Jonathan Leffler
10

Para pesquisar no diretório atual recursivamente:

grep -r 'myString' .
AB Abhi
fonte
5

Se você precisar de uma pesquisa recursiva, terá várias opções. Você deveria considerar ack.

Caso contrário, se você tiver GNU finde xargs:

find . -name '*.cc' -print0 -o -name '*.h' -print0 | xargs -0 grep hello /dev/null

O uso de /dev/nullgarante que você obtenha nomes de arquivos impressos; o -print0e -0lida com nomes de arquivos que contenham espaços (novas linhas, etc).

Se você não tiver nomes obstrutivos (com espaços, etc.), poderá usar:

find . -name '*.*[ch]' -print | xargs grep hello /dev/null

Isso pode pegar alguns nomes que você não pretendia, porque a correspondência de padrões é mais imprecisa (mas mais simples), mas funciona. E funciona com versões não-GNU de finde xargs.

Jonathan Leffler
fonte
note que você também pode dizerfind ... -exec grep "hello" {} +
fedorqui 'SO stop prejudying' 18/08/16
5

Se eu li sua pergunta com atenção, você pede "grep para pesquisar no diretório atual todos e quaisquer arquivos que contenham a string" hello "e exibem apenas arquivos .h e .cc". Então, para atender às suas necessidades precisas, aqui está o meu envio:

Isso exibe os nomes dos arquivos:

grep -lR hello * | egrep '(cc|h)$'

... e isso exibe os nomes e o conteúdo do arquivo:

grep hello `grep -lR hello * | egrep '(cc|h)$'`
Jack
fonte
2
grep -l hello **/*.{h,cc}

Convém shopt -s nullglobevitar mensagens de erro se não houver arquivos .h ou .cc.

Glenn Jackman
fonte
4
Eu sei como usar o google etc. Perguntei aqui porque várias respostas têm "-l" e é bom ter todas as informações em um só lugar.
Andrew Swift
-l ("el" minúsculo) Suprime a saída normal. Imprime o nome de cada arquivo de entrada do qual a saída normalmente seria impressa. A digitalização / pesquisa será interrompida na primeira correspondência.
Rex CoolCode Charles
-1

A maneira mais simples: grep -Ril "Seu texto" /

user1733951
fonte
1
Isso não exibe apenas os arquivos .h ou .cc e é útil explicar quais opções você usou e por quê.
Kon psych