これは、非常に大きなログファイルから抽出したいサンプルログファイルです。
2017-05-30 23:11:34,629 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.AuthenticationProviderImpl - Invoking auth agent [accountName=rene1 remoteAddress=STEDGE/172.16.8.3]
2017-05-30 23:11:14,638 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.AuthenticationProviderImpl - SSH: Failed login attempt on [172.16.8.1]. Username: "rene1".
2017-05-30 23:10:54,663 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.KeyboardInteractiveAuthentication - SSH: Sent SSH_MSG_USERAUTH_INFO_REQUEST (Password Authentication):
2017-05-30 23:10:36,415 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.AuthenticationProviderImpl - User login attempt has been made from address /172.16.8.1:58222
2017-05-30 23:10:36,415 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.AuthenticationProviderImpl - Invoking config agent [accountName=rene1 remoteAddress=/172.16.8.1]
2017-05-30 23:10:36,446 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.AuthenticationProviderImpl - Config agent success [accountName=rene1 remoteAddress=/172.16.8.1]
23:10:36
からへのログのチャンク全体を抽出したいのですが、23:11:34
失敗sed
しました。テストしましたが、期待した結果は期待できませんでした。発生したログのみが返されgrep
、期待したawk
結果ではありませんでした。これが23:10:36
私のコマンドです。
sed -n '/23:10:36/,/23:11:34/p' stlog.txt
これを動作させる方法を誰か知っていますか? 私のプログラムは現在のシステム時間のみを取得し、現在のシステム時間のみに基づいてログを照会するため、日付のない時間のみが含まれます。
答え1
ここでは 2 つの問題が見られます: 1) ログが逆の順序になっているようです。2) 「終了」パターンに一致する行が複数あります。
(ただし、最終行は 23:10:36,446 で、最後から 2 番目の行の 23:10:36,415 よりも後です)
逆の順序では、が見つかった時点23:10:36
でsed
印刷を開始し、 が見つかるまで印刷を続行しますが23:11:34
、 は存在しません。
パターンを逆にすると (以下のように) 解決策のように思えますが、そのパターンが最初に表示された時点で印刷が停止するため、終了パターンに一致する最初の行しか取得されません。
sed -n '/23:11:34/,/23:10:36/p' stlog.txt
awk
この問題を回避することができる解決策は次のとおりです。
awk -vstart="23:11:34" -vend="23:10:36" \
'$0 ~ start {p=1} $0 ~ end {e=1} e && $0 !~ end {p=0} p' stlog.txt
この変数はp
印刷を制御し、「終了」パターンが見られた後にのみクリアされます(e
1)。そして現在の行はもはやそのパターンと一致しません。