GNU/Linux >> Linux の 問題 >  >> Linux

パターンの最後の出現を見つけて、最後の出現に続くすべての行を印刷する方法は?

この質問にはすでに回答があります :POSIX.2の最後のマーカーからEOFへのテキストの取得

(5つの回答)
2年前に閉鎖されました。

パターン“ ====”の複数のオカレンスを含むファイルがあります 。これらのパターンの後にテキストが続きます。 “ ====”の最後の出現を検索したい パターンを作成し、パターンの後のすべての行を印刷します。 bashでそれを行う方法について何かアイデアはありますか? grepの組み合わせ 、awksed または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

承認された回答:

ソフトウェアツール方式。ファイルの末尾のみを読み取り、最後に一致するものが見つかると停止するため、大きなファイルに対してより効率的です。

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

注:999999を増減します 必要に応じて、可能な一致よりも長くなります。このコードは、最後の一致が大きなファイルの終わり近くにあることが事前にわかっている場合に最適に機能します。 Glenn Jackmanも参照してください。 awkのバリエーションを使用したの回答 およびsed 999999の必要性を回避します 。リソースが非常に少ないシステムの場合、grep awkよりも効率的です またはsed

推測を避けるために、いくつかの追加されたstat 醜さはうまくいくでしょう:

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

Linux
  1. すべてのファイルとディレクトリを再帰的に一覧表示する方法

  2. awk を使用して n 番目から最後までのすべての列を出力する

  3. 特定のサイズを超えるファイルをすべて取得して削除する方法

  1. sed を使用してファイルの最後の n 行を削除する方法

  2. 「カット」を使用して最後のフィールドを見つける方法

  3. ディレクトリの下のすべてのシンボリックリンクを解除するには?

  1. 各50行から15行目と25行目を印刷する方法は?

  2. Imgファイルのタイプを見つけてマウントする方法は?

  3. コマンドラインで gz 圧縮ファイルの最後の行を出力するには?