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

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

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

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

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

matches-myfile1
matches-myfile2
matches-myfile3

可能ですか?どうすればいいですか?私が探している答えはbashまたはzshです。

答え1

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

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

もしあなたならしたファイルを保存するには、次のように単語の分割を正しく考慮する必要があります。

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

答え2

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

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

答え3

私はこれが可能だとは思わないが、それのための小さなスクリプトを書くことは可能です。

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

答え4

grep出力ファイル名を使用して-Hからawk

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

関連情報