複数のパターンを含むファイルがあります。"===="。これらのパターンの後にテキストが続きます。最後に発生したアイテムを検索したいです。"===="パターンを作成し、パターンの後ろのすべての行を印刷します。 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
と変形sed
999999
リソースが非常に少ないシステムの場合。よりgrep
効率的です。awk
sed
推測を避けるために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