Dengan GNU awk (gawk ) Anda dapat menggunakan BEGINFILE aturan untuk membaca pola baru setiap kali file masukan berubah:
$ gawk 'BEGINFILE{getline pat < "search.patterns"} $0 ~ pat' file\ {1..3}.txt
home 3
dog 1
cat 4
Anda harus benar-benar memeriksa getline itu mengembalikan pola baru, misalnya
gawk '
BEGINFILE {
if((getline pat < "search.patterns") <= 0) {
print "Error reading pattern" > "/dev/stderr"
exit 1
}
}
$0 ~ pat
' file\ {1..3}.txt
Perhatikan bahwa awk pola diperpanjang ekspresi reguler, serupa dengan yang didukung oleh grep dengan -E opsi.
Anda dapat mencapai hal yang sama di awk non-GNU dengan meneruskan search.patterns sebagai file pertama dan menggunakan NR dan FNR dengan tepat untuk membaca pola ke dalam larik terindeks, atau mencari pola berikutnya dalam larik.
Menggunakan 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
Mengujinya:
$ bash script.sh
home 3
dog 1
cat 4
Skrip menyimpan nama file yang relevan di files array, dan kemudian mulai membaca pola dari search.patterns mengajukan. Untuk setiap pola, file pertama di files daftar diminta. File yang diproses kemudian dihapus dari files list (menghasilkan nama file pertama yang baru dalam daftar).
Jika jumlah pola melebihi jumlah file di files , akan ada error dari grep .
Anda bisa menggunakan paste untuk mencocokkan pola dengan file:
paste <(printf "%s\n" *.txt) search.patterns | while IFS=$'\t' read -r file pattern; do
grep -- "$pattern" "$file"
done
Saya berasumsi bahwa nama file tidak mengandung tab.