私はシェルスクリプトの経験があまりありませんが、パターンをgrepする方法を理解しようとしています。一致するファイルごとに、grepからの一致する行を含むファイルをディスクに書き込みます。例えば:
$ grep -E "MY PATTERN" myfile{1,3}
次に、一致する行を含む新しいファイルを書き出します。
matches-myfile1
matches-myfile2
matches-myfile3
これは可能ですか?これどうやってするの?答えを探しているのはbashまたはzshです。
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
Awkを使用する1つの方法:
awk '/MY PATTERN/{print > "matches-"FILENAME;}' myfile{1,3}
私はこれが可能だとは思いませんが、そのための小さなスクリプトを作成することは可能です
#! /bin/bash
files=(file1 file2 file3)
for i in "${files[@]}"; do grep -E "MY PATTERN" < "$i" > matches-"$i"; done
GNU find and GNU parallel:
find . -type f -print0 | parallel -0 grep '"MY PATTERN"' '{} > {//}/matches.{/}'
grep
に-H
を使用してファイル名を出力させ、awk
を使用してファイル名に書き込むことができます。
$ grep -H regexp files* | awk -F : '{ file="matches-" $1; sub("^[^:]+:","",$0); print $0 > file; }'