tl;dr
ダウンロードした RDS (今回は PostgreSQL) のスローログを以下のような感じで出力したいと思って試行錯誤したのでメモしておきます.
xxx1.xxx ms SELECT * FROM xxxx WHERE xxx1 xxx2.xxx ms SELECT * FROM xxxx WHERE xxx2 ...
一番左の列には経過時間, その後にクエリの文字列全てを出力したいと思います. また, 経過時間が長い順番に降順に出力します.
ちなみに, 実際のログファイルは以下のような文字列になっています.
2020-07-07 09:07:46 UTC:xx.xx.xx.xx(58946):user@db:[1234]:LOG: duration: 2953.164 ms execute <unnamed>: SELECT * FROM foo WHERE bar = xxx 2020-07-07 09:08:46 UTC:xx.xx.xx.xx(58946):user@db:[1234]:LOG: duration: 3053.164 ms execute <unnamed>: SELECT * FROM foo WHERE bar = xxx
ワンライナー
以下のようなワンライナーを書きました.
$ grep duration postgresql.log.YYYY-MM-DD-HH | cut -d ' ' -f 6- | sort -r -n | sed 's/execute <unnamed>://'
先述の文字列で試してみます.
$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=18.04 DISTRIB_CODENAME=bionic DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS" $ cat << EOS | cut -d ' ' -f 6- | sort -r -n | sed 's/execute <unnamed>://' > 2020-07-07 09:07:46 UTC:xx.xx.xx.xx(58946):user@db:[1234]:LOG: duration: 2953.164 ms execute <unnamed>: SELECT * FROM foo WHERE bar = xxx > 2020-07-07 09:08:46 UTC:xx.xx.xx.xx(58946):user@db:[1234]:LOG: duration: 3053.164 ms execute <unnamed>: SELECT * FROM foo WHERE bar = xxx > EOS 3053.164 ms SELECT * FROM foo WHERE bar = xxx 2953.164 ms SELECT * FROM foo WHERE bar = xxx
意図したように出力されました.
キモは cut -d ' ' -f 6-
でしょうか.
$ cut --help Usage: cut OPTION... [FILE]... Print selected parts of lines from each FILE to standard output. With no FILE, or when FILE is -, read standard input. Mandatory arguments to long options are mandatory for short options too. ... -d, --delimiter=DELIM use DELIM instead of TAB for field delimiter -f, --fields=LIST select only these fields; also print any line that contains no delimiter character, unless the -s option is specified ...
-d
はデリミタはスペース, -f
は列を指定することになりますが, 6-
を指定することで, 6 列目以降を取得しています.
参考
以下の記事を参考にさせて頂きました.
ありがとうございました.
以上
メモでした. まだまだ知らないことが多いです.