Posso usar o find e o grep em uma linha?

7

Eu tenho uma estrutura de diretório baseada em eventos.

Nesses eventos, tenho um tipo de arquivo que contém ou não um padrão para o qual preciso pesquisar. Os resultados positivos que gostaria de armazenar em um arquivo separado.

Minha primeira abordagem foi:

find . /EVENT*/'filename' | grep 'searchtext' head -2 > error_file

mas isso não parece funcionar. Disseram-me que não é possível combinar find e grep dessa maneira, então, como eu preciso fazer isso?

    
por Jos 15.03.2015 / 19:03

4 respostas

14

Aqui está um padrão geral:

find /directory/containing/files -type f -exec grep -H 'pattern_to_search' {} +

Aqui, a princípio, find pesquisará todos os arquivos no diretório que contém os arquivos necessários. Você também pode usar curingas, por exemplo. *.txt para procurar apenas os arquivos que terminam com .txt . Nesse caso, o comando seria:

find /directory/containing/files -type f -name "*.txt" -exec grep -H 'pattern_to_search' {} +

Depois de encontrar os arquivos necessários, estamos procurando o padrão desejado nesses arquivos usando -exec grep -H 'pattern_to_search' {} + ( -H imprimirá o nome do arquivo onde o padrão é encontrado). Aqui você pode pensar em {} como contendo os arquivos a serem pesquisados e + é necessário para ser usado no final com -exec , para que -exec seja bifurcado apenas uma vez, ou seja, grep pesquisará como se o o comando é grep -H 'pattern_to_search' file_1.txt file_2.txt file_3.txt .

    
por 15.03.2015 / 19:07
5

Outro método válido é:

 find /directory/containing/files -type f -print0 | xargs -0 grep "test to search"

A print0 / opção -0 é para permitir o caso em que as cadeias de nomes contenham caracteres especiais (como espaços).

    
por 15.03.2015 / 19:16
3

E mais uma forma, em apenas um único processo (sem find , -exec , xargs ):

grep -r "test to search" /directory/containing/files

Bem, com o GNU grep, de qualquer forma. :)

ETA: Desde que me pediram para mostrar a opção grep --include , aqui está um análogo ao exemplo de heemayl ("você também pode usar curingas eg * .txt para procurar apenas arquivos terminados com .txt"):

grep --include '*.txt*' -r "pattern to search" /directory/containing/files

E enquanto eu estou editando, sim, estas são alternativas, não substituições internas: esses comandos lerão arquivos (regulares) por meio de links simbólicos. (Eles não vão recorrer através de diretórios com links simbólicos, pois para isso você precisa de -R .) Eles também lerão soquetes, pipes nomeados e arquivos de dispositivo (embora -D skip possa ser adicionado para, um, pule aqueles). E não há como grep obter o efeito de find opções como -mtime -2 . Se você precisar disso - use find . Se você não, eu diria que grep é uma boa alternativa.

    
por 15.03.2015 / 19:43
0

Assumirei que você precisa fazer um grep para um determinado padrão através de arquivos de texto e recursar por subdiretórios. Se você está usando o GNU grep, é bem simples:

cd /to/the/top/level    
grep -r "PatternToSearch" *

Em vez de -r , você pode usar -R ou --recursive

Você deve usar aspas se tiver espaços no seu padrão de pesquisa.

Existem muitas opções para o GNU grep. Basta digitar grep --help e você ficará surpreso!

    
por 18.03.2015 / 10:35

Tags