Como usar o comando grep para conseguir isso? [fechadas]

0

Eu tenho vários arquivos file_1, file_2, .. dentro de uma pasta e alguns arquivos contêm um padrão pattern_abc .

Como posso criar um new_file que contenha as linhas de todos os arquivos com o padrão pattern_abc ?

    
por sid 16.08.2018 / 10:34

4 respostas

2

Para escolher apenas as linhas que correspondem a pattern_abc de todos os arquivos em dir , use

$ grep -h 'pattern_abc' dir/* > new_file

O sinalizador -h fará com que grep não exiba o nome do arquivo junto com as linhas correspondentes.

    
por 16.08.2018 / 10:37
0

Você pode tentar grep recursivo,

grep -r pattern directory > new_file
  • -r Leia todos os arquivos em cada diretório, recursivamente.
por 16.08.2018 / 10:38
0

Com o GNU grep :

grep -lZ pattern_abc folder/file_* | xargs -r0 cat > new_file

(Se estiver usando zsh , você pode substituir file_* por file_*(.) para considerar apenas arquivos regulares ou file_*(.n) para classificar a lista de arquivos numericamente (então file_9 vem antes file_10 por exemplo).

Ou de forma recursiva e considerando apenas arquivos regulares :

find folder -name 'file_*' -type f -exec grep -lZ pattern_abc {} +|
  xargs -r0 cat > new_file

Note, entretanto, que a lista de arquivos não está classificada, então os arquivos serão concatenados em alguma ordem aleatória.

Com zsh para ordenar os arquivos numericamente dentro de cada pasta encontrada:

grep -lZ pattern_abc folder/**/file_*(Dn.) | xargs -r0 cat > new_file

( D também procura em diretórios ocultos como find ).

    
por 16.08.2018 / 10:54
0

Isso localizará os arquivos que contêm linhas correspondentes a pattern_abc e exibirão seu conteúdo integralmente (não apenas as linhas correspondentes).

grep -q , pára assim que o primeiro padrão encontrado é encontrado e find processa o próximo arquivo.

find . -type f -execdir grep -q 'pattern_abc' {} \; -exec cat {} >> /path/to/outfile \;
    
por 16.08.2018 / 10:55

Tags