S GNU awk (gawk ) můžete použít BEGINFILE pravidlo pro čtení nového vzoru pokaždé, když se vstupní soubor změní:
$ gawk 'BEGINFILE{getline pat < "search.patterns"} $0 ~ pat' file\ {1..3}.txt
home 3
dog 1
cat 4
Měli byste opravdu zkontrolovat, že getline vrátí nový vzor, například
gawk '
BEGINFILE {
if((getline pat < "search.patterns") <= 0) {
print "Error reading pattern" > "/dev/stderr"
exit 1
}
}
$0 ~ pat
' file\ {1..3}.txt
Všimněte si, že awk vzory jsou rozšířené regulární výrazy, podobné těm, které podporuje grep s -E možnost.
Totéž můžete dosáhnout v ne-GNU awk předáním search.patterns jako první soubor a pomocí NR a FNR vhodně buď načíst vzory do indexovaného pole, nebo vyhledat další vzor v poli.
Pomocí 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
Testování:
$ bash script.sh
home 3
dog 1
cat 4
Skript uloží příslušné názvy souborů do files pole a poté pokračuje ve čtení vzorů z search.patterns soubor. Pro každý vzor první soubor v files seznam je dotazován. Zpracovaný soubor je poté odstraněn z files seznam (poskytne nový první název souboru v seznamu).
Pokud počet vzorů překročí počet souborů v files , budou chyby od grep .
Můžete použít paste pro shodu vzoru se souborem:
paste <(printf "%s\n" *.txt) search.patterns | while IFS=$'\t' read -r file pattern; do
grep -- "$pattern" "$file"
done
Předpokládám, že názvy souborů neobsahují tabulátory.