質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Cygwin

Cygwinは、Unixのような環境を、Windows上で構築させるコマンドラインインターフェースです。

grep

grepはコマンドライン上でテキスト検索を可能にするユーティリティーです。元はUnixのために用意されたものです。

Q&A

解決済

1回答

3585閲覧

grep等でファイル内の複数行のログを検索したい(cygwin)

usugita_san

総合スコア226

Cygwin

Cygwinは、Unixのような環境を、Windows上で構築させるコマンドラインインターフェースです。

grep

grepはコマンドライン上でテキスト検索を可能にするユーティリティーです。元はUnixのために用意されたものです。

0グッド

0クリップ

投稿2016/11/07 07:27

編集2016/11/07 07:29

cygwin上のgrepでログの調査を行っています。
以下のようなログに対して調査を行っています。

2015-07-19 10:54:24,297 +09:00 [2015-07-19 01:54:24,297 GMT] [1] INFO HogeCorp.SampleApp.AppContext [(null)] - 何かのログ
2015-07-19 10:54:24,313 +09:00 [2015-07-19 01:54:24,313 GMT] [1] INFO HogeCorp.SampleApp.AppContext [(null)] - --- 何かのログ ---
2015-07-19 10:54:47,261 +09:00 [2015-07-19 01:54:47,261 GMT] [1] ERROR HogeCorp.SampleApp.Forms.LoginForm [(null)] - ログインに失敗しました。 [Code=200]
HogeCorp.SampleApp.Lib.Service.ApiException: LoginFaild
場所 HogeCorp.SampleApp.Lib.Service.LoginService.<_Login>d__23.MoveNext() 場所 c:\test\TestApp\workspace\HogeCorp.SampleApp\HogeCorp.SampleApp.Lib\Service\LoginService.cs:行 86
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
場所 HogeCorp.SampleApp.Lib.Service.LoginService.<Login>d__14.MoveNext() 場所 c:\test\TestApp\workspace\HogeCorp.SampleApp\HogeCorp.SampleApp.Lib\Service\LoginService.cs:行 30
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
場所 HogeCorp.SampleApp.Forms.LoginForm.<_login>d__d.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
場所 HogeCorp.SampleApp.Forms.LoginForm.<ButtonOk_Click>d__1.MoveNext()
2015-07-19 10:57:10,447 +09:00 [2015-07-19 01:57:10,447 GMT] [1] INFO HogeCorp.SampleApp.Forms.ContentsForm [(null)] - 処理が完了しました。
2015-07-19 10:58:06,026 +09:00 [2015-07-19 01:58:06,026 GMT] [1] INFO HogeCorp.SampleApp.Forms.ContentsForm [(null)] - 他にも処理が完了しました。
2015-07-19 10:58:35,052 +09:00 [2015-07-19 01:58:35,052 GMT] [1] INFO HogeCorp.SampleApp.Forms.CreateFolderForm [(null)] - 色々と完了しました。

このようなログで、3行目からの「2015-07-19 10:54:47,261」で始まるログをgrepで取得したいと考えています。
通常のgrepでは、複数行の検索方法が解らず、やむを得ずpcregrepを使用したのですが、今度は関係ない行まで検索されて困っています。

以下のようなコマンドを実行します。

$ pcregrep -M "^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3} +09:00 [\s\S]+?トレースの終わり" sample.log

以下のような結果が得られます。

2015-07-19 10:54:24,297 +09:00 [2015-07-19 01:54:24,297 GMT] [1] INFO HogeCorp.SampleApp.AppContext [(null)] - 何かのログ
2015-07-19 10:54:24,313 +09:00 [2015-07-19 01:54:24,313 GMT] [1] INFO HogeCorp.SampleApp.AppContext [(null)] - --- 何かのログ ---
2015-07-19 10:54:47,261 +09:00 [2015-07-19 01:54:47,261 GMT] [1] ERROR HogeCorp.SampleApp.Forms.LoginForm [(null)] - ログインに失敗しました。 [Code=200]
HogeCorp.SampleApp.Lib.Service.ApiException: LoginFaild
場所 HogeCorp.SampleApp.Lib.Service.LoginService.<_Login>d__23.MoveNext() 場所 c:\test\TestApp\workspace\HogeCorp.SampleApp\HogeCorp.SampleApp.Lib\Service\LoginService.cs:行 86
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---

まず、1行目と2行目のログは不要なので、出ないで欲しいです。
3行目以降のログは、ちゃんと次の行まで出力して欲しいのです。

このような検索の方法をどなたかご存知無いでしょうか・・・。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

「目的の文字列から、遡って直近のタイムスタンプのある行まで」ということでしょうから、正規表現では難しい(無理?)と思います。
awkでしょうか。

awk '/^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]/{a=$0;next} {a=a "\n" $0} /トレースの終わり/{print a;a=""} '

追記:
↑これだと余計な空行が入っちゃいますね。ちょっと見にくくなりますが、

awk '/^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]/{a=$0;next} {if(a=="") a=$0;else a=a "\n" $0} /トレースの終わり/{print a;a=""} '

投稿2016/11/07 08:12

編集2016/11/07 08:28
otn

総合スコア84499

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

usugita_san

2016/11/10 07:52

ありがとうございます。まだ実現できていないのですが、awkでどうにかなりそうです。 awkに関して疑問があればまだ質問させて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問