2017-05-18 17 views
0

サーバーの起動時にログファイルにエラーが発生する傾向があり、これを達成するためにlessが使用されます。ログファイルからのテキストのブロックをブロックします。

しかし、もっと効率的なものが欲しいです。

私は2つのパターンのログを見てみたい

「サーバーの停止」と私はsed

sed -n '/Stopping/,/Server startup/p' test.txt 

を使用してこれが正常に動作しますが、問題があると、これを達成した 「スタートアップ」。ログファイルにこのパターンが何度も繰り返して(サーバーが停止して開始すると)、このパターンの最後のブロックだけを取得するにはどうしたらいいですか? (これは、起動中のサーバーとログの最後のシャットダウンになります)。 tacsedに基づいて

+0

'TAC test.txtのを試してみてください| sed -n '/サーバーの起動/、/停止/ {p; /停止/ q}' | tac' – Sundeep

答えて

0

シンプルなソリューション:

tac test.txt | sed -e '/stopping/,$d' | tac | sed -e '/startup/,$d' 

を説明:逆に

tac連結して印刷ファイルを。

sed -e '/your_keyword/,$d'は、 'your_keyword'に達するまで行を開始します。

...ログファイルを最後から印刷し、最初の部分を削除して、もう一度元に戻し、2番目の部分を削除してください... etvoilà!

それをテストするには:

echo " 
xxxxxxxxxxx 
xxxxxxxxxxx 
xxx start xxxx 
aaa1 
aaa2 
xx stop xxx 
xxxyyyyxxxxyyyxxxx 
xxxyyyyxxxxyyyxxxx 
xyyyxx start xxxyyyyx 
bbb1 
bbb2 
yy stop yy 
yyyyyyyyy 
yyyyyyyyy" | tac |sed -e '/start/,$d' | tac | sed -e '/stop/,$d' 

出力:これは(GNUのSED)あなたのために働くかもしれない

bbb1 
bbb2 
+0

エコーに開始と停止を含める場合はどうすればよいですか? – Sgr

+0

私は、コマンドラインを使ってログブロックを隔離するために 'test.txt'というファイル(あなたの質問に名前が付けられている)をフィルタリングすることを想像します。私。 _tac test.txt | sed -e ..._ ...「エコー」が何を話しているのかは分かりません。あなたの質問を明確にしてください。 – MarcM

+0

申し訳ありません私が単に意味していたのは、あなたが解決策を示していることです.bbb1とbbb2は、私が提供した2つのテキスト文字列の間にあります。私が尋ねるのは、出力が "start"になるように "start"と "stop"という文字列行を希望の出力に含めることができるかどうかです。bbb1 bbb2 "stop" – Sgr

0

sed '/Stopping/,/Server startup/{/Stopping/h;//!H};$!d;x' file 

必要な行の各出現を保留空間(HS)に格納し、他のすべての行を削除します。ファイルの終わりにHSにスワップし、格納されているものを印刷します。

HSの最新の行は、それ以前の行を上書きします。

0

範囲表現を使用しないでください。単純な作業のコードを非常にわずかに簡潔にしますが、若干面白い作業は完全な書き換えまたは重複条件を必要とします。 awkを使うだけで、範囲を強制的に動作させる代わりにフラグを使うだけでよく、必要に応じて正規表現比較ではなく文字列比較を行うこともできます。 8を含む最後の行を通じて5を含む最後の行から印刷する

$ seq 20 | awk '/5/{f=1;s=""} f{s=s $0 ORS} /8/{f=0} END{printf "%s", s}' 
15 
16 
17 
18 
関連する問題