ようへいの日々精進XP

よかろうもん

ダウンロードした RDS (PostgreSQL) のスローログで duration とクエリだけを出力するワンライナー

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 列目以降を取得しています.

参考

以下の記事を参考にさせて頂きました.

man7.org

blog.cles.jp

ありがとうございました.

以上

メモでした. まだまだ知らないことが多いです.