最後のパターン発生を見つけ、最後の発生以降のすべての行を印刷する方法

最後のパターン発生を見つけ、最後の発生以降のすべての行を印刷する方法

複数のパターンを含むファイルがあります。"===="。これらのパターンの後にテキストが続きます。最後に発生したアイテムを検索したいです。"===="パターンを作成し、パターンの後ろのすべての行を印刷します。 Bashでこれを行う方法についてのアイデアはありますか?grep、、awkなどsedの組み合わせtail

サンプルファイル:

====

First run of script

End of first Script

====

2nd run of script

End of 2nd script

====

3rd run of script

End of 3rd script

このコマンドの出力は次のようになります。

3rd run of script

End of 3rd script

答え1

agcの答えと同じ概念ですが、行数を推測する必要はありません。

GNU sedの使用

tac file | sed '/====/Q' | tac

それとも

tac file | awk '/====/ {exit} 1' | tac

doubleのアイデアtacは問題を裏返すことです:すべての行を印刷する方法今後これ最初パターンが発生します。これははるかに簡単な質問です。

答え2

ソフトウェアツールのアプローチは、ファイルの終わりだけを読み、最後の一致が見つかると停止するため、大容量ファイルの方が効率的です。

tac sample.txt | grep -F -m1 -B 999999 '====' | head -n -1 | tac

注:999999可能な一致よりも長くするために、必要に応じて増減します。このコードは、最後の一致が大容量ファイルの終わりに近いことを事前に知っている場合に最適です。また、見ることができますグレンジャックマンとの答えawkと変形sed999999リソースが非常に少ないシステムの場合。よりgrep効率的です。awksed

推測を避けるためにstat何か醜いものを追加すると効果的です。

f=sample.txt; tac "$f" | grep -F -m1 -B $(stat -c '%s' "$f") '====' |
head -n -1 | tac

答え3

に基づいてだから繰り返します。:

$ sed -n '/====/h;//!H;$!d;x;//p' sample.txt 
====

3rd run of script

End of 3rd script

Output of the command should look like below.

3rd run of script

End of 3rd script

説明を書き始めましたが、実際にいくつかのコマンドを理解していないため、参照のみしましたinfo sed

答え4

テキストを保存file.txtし、次のコマンドを実行します。

awk 'p; /====/ $p' file.txt | tail -3

出力:

3rd run of script

End of 3rd script

関連情報