3
3

More than 5 years have passed since last update.

PerlのワンライナーでMySQLのSlow LogをParseする、もしくはPerlで複数行の正規表現マッチの話

Last updated at Posted at 2014-02-10

元のスローログ

大体こんな感じで出力されてると思います。

# Time: 140210  15:00:00
# User@Host: ...
# Query_time: 1.99999 ...
...

ワンライナー

grep -A2とかやって複数行出力すると、--で区切られて出力されます。これを利用してます。

-0777は-nオプションの1行つづ取り出すのを無効にするためにつけてます。大きいファイルだときついかもしれません。

この出力を3行ずつでsplitして、/s.を改行にもマッチさせるようにし、TimeとQuery_timeをパースしてそれぞれ一行にして出力させます。

$ cat mysql_slow.log | grep Time -A2 | perl -0777 -nE 'for(split(/--/,$_)){if(/Time: (?<date>.+?) (?<time>.+?)\n.*Query_time: (?<response>.+?) /s){say "20$+{date} $+{time}\t$+{response}"}}'

出力結果

20140210  15:00:00       1.999999
20140210  15:00:30       2.888888
20140210  15:01:00       3.777777
3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3