GNU awk を使用 (gawk ) BEGINFILE を使用できます 入力ファイルが変更されるたびに新しいパターンを読み取るルール:
$ gawk 'BEGINFILE{getline pat < "search.patterns"} $0 ~ pat' file\ {1..3}.txt
home 3
dog 1
cat 4
getline を本当に確認する必要があります たとえば、新しいパターンを返します
gawk '
BEGINFILE {
if((getline pat < "search.patterns") <= 0) {
print "Error reading pattern" > "/dev/stderr"
exit 1
}
}
$0 ~ pat
' file\ {1..3}.txt
awk に注意してください パターンは拡張されます grep でサポートされているものと同様の正規表現 -E で オプション。
非 GNU awk でも同じことができます search.patterns を渡すことによって 最初のファイルとして NR を使用 そして FNR パターンをインデックス付き配列に読み込むか、配列内の次のパターンを検索します。
bash の使用 :
#!/bin/bash
files=( 'file 1.txt' 'file 2.txt' 'file 3.txt' )
while IFS= read -r pattern; do
grep -e "$pattern" "${files[0]}"
files=( "${files[@]:1}" )
done <search.patterns
テスト:
$ bash script.sh
home 3
dog 1
cat 4
スクリプトは、関連するファイル名を files に保存します 配列、search.patterns からのパターンの読み取りに進みます ファイル。パターンごとに、files の最初のファイル リストが照会されます。処理されたファイルは files から削除されます リスト (リスト内の新しい最初のファイル名を生成します)。
パターン数が files のファイル数を超えた場合 、grep からエラーが発生します .
paste を使用できます パターンをファイルと一致させるには:
paste <(printf "%s\n" *.txt) search.patterns | while IFS=$'\t' read -r file pattern; do
grep -- "$pattern" "$file"
done
ファイル名にタブが含まれていないと仮定しています。