GNU/Linux >> Znalost Linux >  >> Linux

grep dvojice vzorů a souboru

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.


Linux
  1. Tisknout čáry mezi (a včetně) dvěma vzory?

  2. Výstup do Stdout a zároveň Grep do souboru?

  3. Najít vzor a přesunout?

  1. Oprávnění a ukládání souborů?

  2. Řez / Grep A Df -h?

  3. Grep And Tail -f?

  1. Linuxový příkaz grep

  2. Jak grep \nv souboru

  3. Výhody katovacího pilníku a potrubí do grep