複数の正規表現を検索し、各正規表現の一致数を数える必要があるファイルがあるとします。
したがって、次のパターンを組み合わせることはできません。
grep -Po '{regex_1}|{regex_2}|...|{regex_n}' file | wc -l
...各正規表現の発生回数が必要だからです。
明らかにすることができます:
occurences[i]=$(grep -Po "${regex[i]}" file | wc -l)
...しかし、残念ながら、見つかったファイルは非常に大きくなる可能性があり(> 1 GB)、確認する必要があるパターンが多く(数千の範囲)、同じファイルを複数回読み取る必要があるため、プロセスは非常に遅くなります。
これをすばやく実行する方法はありますか?
ベストアンサー1
おそらくawk
最速のシェルツールです。あなたは試すことができます:
awk "/$regex1/ { ++r1 }
/$regex2/ { ++r2 }"'
END { print "regex1:",r1 "\nregex2:",r2 }' <infile
perl
もちろん、あなたの質問のように正規表現を使用する必要がある場合は、perl
それが唯一の答えです。ただし、基本式の代わりにawk
拡張式(たとえば)を使用します。grep -E