Saída de múltiplos arquivos de um único grep?

3

Não tenho muita experiência em scripts de shell, mas estou tentando entender como fazer o grep para um padrão e para cada arquivo em que há uma correspondência, gravar um arquivo no disco que contém a linha correspondente do grep. Por exemplo:

$ grep -E "MY PATTERN" myfile{1,3}

Em seguida, escreva novos arquivos que contenham as linhas correspondentes:

matches-myfile1
matches-myfile2
matches-myfile3

Isso é possível? Como posso fazer isso? Eu estou procurando uma resposta é bash ou zsh.

    
por turtle 09.11.2012 / 15:50

5 respostas

6

Bonsi tem a idéia certa, mas não a abordagem correta (o que se deve fazer com nomes de arquivos contendo espaços ou outros caracteres em branco, por exemplo). Aqui está uma maneira de fazer isso em bash :

for file in myfile{1,3}; do
    grep -E "MY PATTERN" < "$file" > "matches-$file"
done

Se você fez precisa armazenar os arquivos que você deve contabilizar corretamente para a divisão de palavras, assim:

files=( myfile{1,3} )
for file in "${files[@]}"; do
    grep -E "MY PATTERN" < "$file" > "matches-$file"
done
    
por 09.11.2012 / 16:01
6

Uma maneira de usar o awk:

awk '/MY PATTERN/{print > "matches-"FILENAME;}' myfile{1,3}
    
por 09.11.2012 / 16:11
2

eu não acho que isso seja possível, mas é possível construir um pequeno script para isso

#! /bin/bash
files=(file1 file2 file3)
for i in "${files[@]}"; do grep -E "MY PATTERN" < "$i" > matches-"$i"; done
    
por 09.11.2012 / 15:56
2

Você pode fazer isso com o GNU find e o GNU paralelo:

find . -type f -print0 | parallel -0 grep '"MY PATTERN"' '{} > {//}/matches.{/}'
    
por 10.11.2012 / 20:36
1

Você pode tornar grep o nome do arquivo com -H e, em seguida, usar awk para gravar nele.

$ grep -H regexp files*  | awk -F : '{ file="matches-" $1; sub("^[^:]+:","",$0); print $0 > file; }'
    
por 09.11.2012 / 16:21