終了条件を含む Grep

終了条件を含む Grep

大きなファイルがあり、grepの単純なフィルタを使用して表示したいと思います。

これが私のファイルだとしましょう。

TIME0 random data
TIME1 random data
TIME2 INTERESTING LINE
TIME3 random data
TIME4 random data
TIME5 random data
TIME6 random data
TIME7 INTERESTING LINE
TIME8 random data
TIME9 random data
TIME10 random data
TIME11 INTERESTING LINE
TIME12 random data

見せたい面白いラインS:

grep "INTERESTING LINE" myfile

この方法はうまくいきますが、ファイルが大きく、何百万ものファイルが含まれています。面白いラインS.最後の1つだけが必要です。

tac myfile | grep -m3 "INTERESTING LINE"

これはうまくいきますが、必要なものをどのように指定しますか?面白いライン特定の時間が経過すると時間プレフィックス? (またはtac一部時間)

たとえば、上記のサンプルファイルでは、すべてのアイテムをどのようにgrepしますか?面白いラインから私のファイル終わりから終わりまで時間7ただ? (したがってTIME2の面白いセリフは必要ありません):

TIME11 INTERESTING LINE
TIME7 INTERESTING LINE

順序は重要ではありません。 ASCまたはDESC注文を受け入れることができます。

ファイル全体をスキャンしないことが重要です。つまり、ファイルの終わりから始まり、1行ずつ作業します。

grepの終了基準を提供する方法を探しています(最大結果数を定義する代わりに-m)。

ベストアンサー1

sed代わりにgrep入力データの解析をより効果的に制御するには、次のようにします。

$ tac file | sed -n -e '/^TIME6 /q' -e '/INTERESTING LINE/p'
TIME11 INTERESTING LINE
TIME7 INTERESTING LINE

これにより、提案したようにファイルが反転され、tac反転されたデータが渡されますsed

sed表現の2つの方法:

  • /^TIME6 /qで始まる行を見つけたら終了しますTIME6 /^TIME[0-6] /qまたは、時間列に一致する式を使用することもできます。これは古すぎるので面白いことはできません。

  • /INTERESTING LINE/p、与えられた正規表現に一致するすべての行を印刷します。

その結果、新しいタイムスタンプが見つかるまでファイルを読み取ることができなくなります。解析中に見つかった興味深い行は、標準出力として印刷されます。

TIME7検索したい正確なタイムスタンプがわかっている場合:

$ tac file | sed -n -e '/INTERESTING LINE/p' -e '/^TIME7 /q'
TIME11 INTERESTING LINE
TIME7 INTERESTING LINE

これにより、終了したい正確なタイムスタンプであっても、最後に読んだ行(興味深い場合)を印刷できます。

おすすめ記事