オプションでgrep

オプションでgrep

私が使用しているbashのインジケータが1000以上含まれているファイルがあります。

for desig in $(desfile)
do
  grep $desig in listfile
done

リストファイルは100万行を超える行ごとに含めることができるため、速度が重要です。

問題はこのような指標にあります。

PA0EHH
DL/PA0EHH

PA0EHH2回見つかった

私はawkがより選択的かもしれませんが、痛みを伴うほど遅いことを発見しました。

答え1

grep -xF -f desfile listfile

desfileまたはコマンドの場合、

grep -xF -f <(desfile) listfile

または、

desfile | grep -xF -f /dev/stdin listfile

ここで使用されるオプションは

  • -x、行の全長にわたって一致する必要があります。これは、行の部分文字列を一致させないために使用したいものです。
  • -F、正規表現の一致ではなく文字列比較を使用します。これはクエリを高速化し、パターンに正規表現に特殊文字が含まれている場合(そして特殊文字が望ましくない場合)に必要です。
  • -f filename、コマンドラインの文字列以外のファイルからパターンを読み込みます。これは適度に機能します。多い場合たくさんモードではメモリが不足する可能性があります。この場合、分割(またはdesfileコマンドの出力)を複数の小さなファイルに分割し、そのファイルを繰り返すことができます。何があってもあなたはそうですdesfilesplitいいえgrep各パターンごとに一度呼び出したいです!

答え2

インジケーターが各行の始まりであることを確認している場合は、次のことができます。

grep ^$desig listfile

最初のクリックに制限するには、スイッチを追加してください-m 1
より細かい検索が必要な場合は、正規表現を試してください。

testval=2
seq 40 | grep -e ^$testval\\b
seq 40 | grep -e \\b$testval\\b

ユースケースに応じて、両方とも正確に2に一致します。 grepが識別するのを防ぎます。2/2

echo "2/2 2" | grep -e [^\/]\\b$testval\\b

私のbashにはSolitudeの2色しかありません。

答え3

パフォーマンスが問題であるため、多くの場合ripgrepよりもベンチマークの方が速いと見なされます。grep

関連情報