私はシェルスクリプトの経験はあまりありませんが、パターンを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; }'