Mit GNU awk (gawk ) könnten Sie einen BEGINFILE verwenden Regel, bei jeder Änderung der Eingabedatei ein neues Muster zu lesen:
$ gawk 'BEGINFILE{getline pat < "search.patterns"} $0 ~ pat' file\ {1..3}.txt
home 3
dog 1
cat 4
Das sollten Sie unbedingt überprüfen getline gibt ein neues Muster zurück, zum Beispiel
gawk '
BEGINFILE {
if((getline pat < "search.patterns") <= 0) {
print "Error reading pattern" > "/dev/stderr"
exit 1
}
}
$0 ~ pat
' file\ {1..3}.txt
Beachten Sie, dass awk Muster werden erweitert reguläre Ausdrücke, ähnlich denen, die von grep unterstützt werden mit dem -E Option.
Sie könnten dasselbe in Nicht-GNU awk erreichen indem Sie search.patterns übergeben als erste Datei und mit NR und FNR entsprechend, um entweder die Muster in ein indiziertes Array einzulesen oder das nächste Muster im Array nachzuschlagen.
Mit 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
Testen:
$ bash script.sh
home 3
dog 1
cat 4
Das Skript speichert die entsprechenden Dateinamen im files -Array und fährt dann fort, Muster aus search.patterns zu lesen Datei. Für jedes Muster die erste Datei im files Liste abgefragt. Die verarbeitete Datei wird dann aus dem files gelöscht list (ergibt einen neuen ersten Dateinamen in der Liste).
Wenn die Anzahl der Muster die Anzahl der Dateien in files überschreitet , treten Fehler ab grep auf .
Sie könnten paste verwenden um das Muster mit der Datei abzugleichen:
paste <(printf "%s\n" *.txt) search.patterns | while IFS=$'\t' read -r file pattern; do
grep -- "$pattern" "$file"
done
Ich gehe davon aus, dass die Dateinamen keine Tabulatoren enthalten.