内部状態を再開する長期実行プログラムがあります。ログファイルエントリ(クイックvim
フィックスにロードされている)の最新の状態のみを表示したいです。以降のすべての行を表示する方法最後文字列の発生STARTING SESSION
?
私の現在の解決策(ログファイルの長さがGBに達する場合があるため、最後の5000行以上はチェックされません):
tail -n5000 logfile.log | grep -B5000 -v -e 'STARTING SESSION'> shortened.log
これは、セッションで多くのロギングが生成されるとうまく機能しますが、ログが短く、複数回再起動すると、複数のセッションにわたって発生します。
--reverse
本質的に、私はファイルの最初ではなく最後にgrep検索を実行するフラグのようなものが欲しいです。
grep --reverse --after-context=5000 --max-count=1 'STARTING SESSION' logfile.log
メモ:
質問は次のとおりです。n番目の一致が発生した後に行を印刷します。しかし、最後にもう一度現れたかったのです。
問題はほぼ同じですPOSIX.2の最後のトークンからEOFにテキストをインポートするこれはPOSIXの要件がなく、ファイルが大きいためです。私はGNUユーティリティ(私が使用しているmingw64
)を使用する効率的なソリューションを好みます。
ベストアンサー1
ファイルを反転して最初に表示されるまで表示し、出力を再度反転します。
tac logfile.log | sed '/STARTING SESSION/q' | tac
tac
処理する一般(検索可能)ファイルが提供されている場合は有効です。sed
、開始行が表示されるとすぐに終了するため、パイプライン全体は必要な場合にのみログファイルの終わりを処理します(tac
's、sed
's、およびカーネルバッファサイズに丸められます)。これは大容量ファイルに合わせて拡張する必要があります。
tac
GNUユーティリティです。 GNU以外のシステムでは通常tail -r
。
ログファイルに「STARTING SESSION」行がまったくない場合、ユーザーと同じ動作は生成されませんgrep
。ログファイル全体が出力されます。これを防ぐためにバリエーションがあります。コサロナンダの方法以下を使用できます。
tac logfile.log | sed -n '/STARTING SESSION/{H;x;p;q;};H' | tail -n +2 | tac
式はsed
「START SESSION」を探し、一致すると現在の行を保持スペースに追加し、保持スペースをパターンスペースに置き換え、印刷して終了します。追加行が保持スペースに追加されます。tail -n +2
最初の空白行をスキップするために使用されます(予約済みスペースにパターンスペースを追加すると、前に改行が追加されます)。