Avec GNU awk (gawk ) vous pouvez utiliser un BEGINFILE règle pour lire un nouveau modèle à chaque fois que le fichier d'entrée change :
$ gawk 'BEGINFILE{getline pat < "search.patterns"} $0 ~ pat' file\ {1..3}.txt
home 3
dog 1
cat 4
Vous devriez vraiment vérifier que getline renvoie un nouveau motif, par exemple
gawk '
BEGINFILE {
if((getline pat < "search.patterns") <= 0) {
print "Error reading pattern" > "/dev/stderr"
exit 1
}
}
$0 ~ pat
' file\ {1..3}.txt
Notez que awk les motifs sont étendus expressions régulières, similaires à celles prises en charge par grep avec le -E option.
Vous pourriez obtenir la même chose en non-GNU awk en passant search.patterns comme premier fichier et en utilisant NR et FNR de manière appropriée soit pour lire les motifs dans un tableau indexé, soit pour rechercher le motif suivant dans le tableau.
Utilisation de 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
Le tester :
$ bash script.sh
home 3
dog 1
cat 4
Le script enregistre les noms de fichiers pertinents dans le files tableau, puis procède à la lecture des motifs à partir du search.patterns dossier. Pour chaque motif, le premier fichier dans le files liste est interrogée. Le fichier traité est alors supprimé du files list (produisant un nouveau premier nom de fichier dans la liste).
Si le nombre de modèles dépasse le nombre de fichiers dans files , il y aura des erreurs de grep .
Vous pouvez utiliser paste pour faire correspondre le modèle avec le fichier :
paste <(printf "%s\n" *.txt) search.patterns | while IFS=$'\t' read -r file pattern; do
grep -- "$pattern" "$file"
done
Je suppose que les noms de fichiers ne contiennent pas d'onglets.