web-dev-qa-db-ja.com

1つのgrepから複数のファイルを出力しますか?

私はシェルスクリプトの経験があまりありませんが、パターンをgrepする方法を理解しようとしています。一致するファイルごとに、grepからの一致する行を含むファイルをディスクに書き込みます。例えば:

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

次に、一致する行を含む新しいファイルを書き出します。

matches-myfile1
matches-myfile2
matches-myfile3

これは可能ですか?これどうやってするの?答えを探しているのはbashまたはzshです。

4
turtle

Bonsiには正しい考えがありますが、正しいアプローチではありません(たとえば、スペースやその他の空白文字を含むファイル名をどうするか)。 bashでそれを行う方法は次のとおりです。

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

didファイルを保存する必要がある場合は、次のように、Wordの分割を適切に考慮する必要があります。

files=( myfile{1,3} )
for file in "${files[@]}"; do
    grep -E "MY PATTERN" < "$file" > "matches-$file"
done
6
Chris Down

Awkを使用する1つの方法:

awk '/MY PATTERN/{print > "matches-"FILENAME;}' myfile{1,3}
6
Guru

私はこれが可能だとは思いませんが、そのための小さなスクリプトを作成することは可能です

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

GNU find and GNU parallel:

find . -type f -print0 | parallel -0 grep '"MY PATTERN"' '{} > {//}/matches.{/}'
2
Thor

grep-Hを使用してファイル名を出力させ、awkを使用してファイル名に書き込むことができます。

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