1

awkまたはsedを使用してmysql.logを単純な形式に再フォーマットするにはどうすればよいですか?

私はmysql.logの一部を持っています:

131024 13:17:40     1 Query select * from test_numbers
            1 Query select
  n.id,
  n.name,
  n.value
from test_numbers AS n
limit 0, 50
            1 Query select
  count(*)
FROM test_numbers
            1 Query SHOW STATUS
131024 13:17:50     1 Query SHOW STATUS
131024 13:18:00     1 Query select * from test_numbers
            1 Query select
  n.id,
  n.name,
  n.value
from test_numbers AS n
limit 0, 50
            1 Query select
  count(*)
FROM test_numbers
            1 Query SHOW STATUS

「クエリ」行が複数の行にまたがっています。この形式に再フォーマットしたい:

131024 13:17:40     1 Query select * from test_numbers
131024 13:17:40     1 Query select  n.id,  n.name,  n.value from test_numbers AS n limit 0, 50
131024 13:17:40     1 Query select  count(*) FROM test_numbers
131024 13:17:40     1 Query SHOW STATUS
131024 13:17:50     1 Query SHOW STATUS
131024 13:18:00     1 Query select * from test_numbers
131024 13:18:00     1 Query select   n.id,  n.name,  n.value from test_numbers AS n limit 0, 50
131024 13:18:00     1 Query select  count(*) FROM test_numbers
131024 13:18:00     1 Query SHOW STATUS

複数行の「クエリ」を1行にまとめた場合。

私はいくつかのスクリプトを試しましたが、失敗します:

sed -r ':a;N;$!ba;s/\n(^(([0-9]+\t[0-9:]+)|(\t\t[0-9:]+)))/ \1/g' mysql.log
awk '/^(([0-9]+ [0-9:]+)|(\t\t[0-9:]+))/{print "";next}{printf $0}END{print "";}' mysql.log

ありがとう!私はいくつかの貢献を修正しました。投稿された回答を確認してください。

4

5 に答える 5

2
$ cat tst.awk
/[[:digit:]]+ +Query/ {
    if (rec) print rec

    if ( match($0,/^[[:digit:]]+ [[:digit:]:]+ +/) ) {
        ts = substr($0,RSTART,RLENGTH)
    }
    else {
        sub(/^ +/,ts)
    }

    rec = $0
    next
}

{ sub(/^ +/,""); rec = rec OFS $0 }

END { if (rec) print rec }

$ awk -f tst.awk file
131024 13:17:40     1 Query select * from test_numbers
131024 13:17:40     1 Query select n.id, n.name, n.value from test_numbers AS n limit 0, 50
131024 13:17:40     1 Query select count(*) FROM test_numbers
131024 13:17:40     1 Query SHOW STATUS
131024 13:17:50     1 Query SHOW STATUS
131024 13:18:00     1 Query select * from test_numbers
131024 13:18:00     1 Query select n.id, n.name, n.value from test_numbers AS n limit 0, 50
131024 13:18:00     1 Query select count(*) FROM test_numbers
131024 13:18:00     1 Query SHOW STATUS
于 2013-10-24T19:15:41.030 に答える