GNU/Linux >> Linux の 問題 >  >> Linux

パターンとファイルの grep ペア

GNU awk を使用 (gawk ) BEGINFILE を使用できます 入力ファイルが変更されるたびに新しいパターンを読み取るルール:

$ gawk 'BEGINFILE{getline pat < "search.patterns"} $0 ~ pat' file\ {1..3}.txt
home 3
dog 1
cat 4

getline を本当に確認する必要があります たとえば、新しいパターンを返します

gawk '
  BEGINFILE {
    if((getline pat < "search.patterns") <= 0) {
      print "Error reading pattern" > "/dev/stderr"
      exit 1
    }
  } 
  $0 ~ pat
' file\ {1..3}.txt

awk に注意してください パターンは拡張されます grep でサポートされているものと同様の正規表現 -E で オプション。

非 GNU awk でも同じことができます search.patterns を渡すことによって 最初のファイルとして NR を使用 そして FNR パターンをインデックス付き配列に読み込むか、配列内の次のパターンを検索します。


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

テスト:

$ bash script.sh
home 3
dog 1
cat 4

スクリプトは、関連するファイル名を files に保存します 配列、search.patterns からのパターンの読み取りに進みます ファイル。パターンごとに、files の最初のファイル リストが照会されます。処理されたファイルは files から削除されます リスト (リスト内の新しい最初のファイル名を生成します)。

パターン数が files のファイル数を超えた場合 、grep からエラーが発生します .


paste を使用できます パターンをファイルと一致させるには:

paste <(printf "%s\n" *.txt) search.patterns | while IFS=$'\t' read -r file pattern; do
    grep -- "$pattern" "$file"
done

ファイル名にタブが含まれていないと仮定しています。


Linux
  1. 複数のパターンでGrepを実行する方法は?

  2. 2つのパターンの間(およびそれを含む)の線を印刷しますか?

  3. ファイルからGrepパターンを読み取る?

  1. Stdoutに出力し、同時にGrepをファイルに出力しますか?

  2. パターンを見つけて移動しますか?

  3. Rsync の include および exclude オプションを使用して、パターンごとにディレクトリとファイルを含める

  1. ファイルのアクセス許可と保存?

  2. Cut / Grep And Df -h?

  3. Grep And Tail -f?