grepをファイルと追加の正規表現と組み合わせる方法

grepをファイルと追加の正規表現と組み合わせる方法

各行には文字列ファイルがあります。

たとえば、

AAAAA   
BBBBB   
CCCCC  
etc  

特定のディレクトリの一連のファイルに各文字列が存在するかどうかを1つずつ確認したいと思います。

私は何ができるかを知っています。grep -f filenameすぐに検索をすることです。しかし、私に必要なのは、より具体的な結果を得るために1行に1つ以上の正規表現を使用することです。文字列を含むファイルはサイズが大きく頻繁に変更されるため、式を追加するために各行を変更することは意味がありません。

したがって、私にとって必要なのは、grep -f filenameファイルの各行を繰り返し(そしてファイルからそれらをgrepしながら)、より多くの条件を追加することです。例えばAAAAAそして [0-9]{1,3}$同じ行にも存在します。

答え1

grepパイプラインを使用して、このステップを段階的に実行できます。

grep -f your_file list_of_files|grep -E extra_condition

または

while read line; do
    grep -E -e "$line" -e extra_condition list_of_files
done < your_file

どちらの場合も、-E次の形式(数値数量子を含む)のパターンを使用するには[0-9]{1,3}$切り替える必要があります。

編集する

Drav Sloanのコメントのおかげで、私たちは2番目のバージョン(loop while)を次のように単純化することができます。

grep -E -e "extra_condition" -f your_file list_of_files

しかし、実際にはパターンを探します。またはもう一つはパターンではありませんそしてもう一つ。最初の形式に固執する必要があります。

答え2

awkandを使用する別の方法を示すためのものですgrep

サンプル

$ cat patterns.txt 
AAAA
BBBB
CCCC
DDDD
EEEE

$ cat sample.txt 
AAAA 1
AAAA 2
AAAA 3
AAAA 4
DDDD 1
DDDD 2
YYYY 1
YYYY 2

はい

奇妙な#1:

$ awk 'FNR==NR{a[$0]; next}($1 in a)' patterns.txt sample.txt | grep -E "[0-9]{1,3}$"
AAAA 1
AAAA 2
AAAA 3
AAAA 4
DDDD 1
DDDD 2

調整が必要になる可能性が高いですが、調整方法の入力を求められます。

奇妙な#2:

$ awk 'FNR==NR{a[$0];next};{for (i in a){if (match($0,i)) print}}' patterns.txt sample.txt | grep -E "[0-9]{1,3}$"
AAAA 1
AAAA 2
AAAA 3
AAAA 4
DDDD 1
DDDD 2

これはより柔軟で、サンプルデータ行内のどこからでもパターン文字列を処理できます。

関連情報