エンジニア兼営業を担当しているきーちゃんです。
障害対応などでログファイルを調査することがあると思います。
その場合、みなさんはどうやって実施していますか?
サーバーがUNIXの場合、ローカル環境へファイルを持ってきて、Windows上でsakuraのgrepや複雑な場合は、VBAなどのプログラムで対応している方も多いのではないでしょうか。
今回、UNIX環境限定ではありますが、awkを使った便利な調査方法の一部をご紹介いたします。(SQLが記載されたログファイル調査)
実行SQLが出力されたログファイルから、SQL文を1行にまとめる
例えば、以下のようなSQL文が出力されているログファイルがあるとします。
1 2 3 4 5 6 7 8 9 10 11 |
2017/07/xx 10:00:00:000 ユーザA SQLID select A, B, C FROM SAMPLE WHERE A='xxxxx' ; ・ ・ ・ |
このログからユーザ名やSQLIDでGREPするとその行のみしか出力されず、条件に指定している値も必要だとします。(値は可変で調査では不明)
その場合、以下のコマンドを実行することで1行にまとめることができます。
※まとめた後にgrepすれば調査可能
awk ‘{
if ( $0 ~ /^;/ ) { flg=0 } else { ORS=” “; flg=1 }
if ( flg == 1 ) { print $0; }
else { ORS=”\n”; print $0; }
}’ ログファイル名 > 結果ファイル名
あるユーザが特定の時間のみ実行したSQLのみを抽出
↑と同じようなログファイルで、以下のようにすれば抽出することができます。
awk ‘$4 ~ ユーザID/ { flg==1; } $0 ~ /^;/ { if ( flg==1 ) print$0; flg=0 }
{ if ( flg == 1 ) print $0; }’ ログファイル名 |
awk
‘$0 ~ /^– 2016\/09\/30 11:00/ { flg=1; }
$0 ~ /^– 2016\/09\/30 11:10/ { flg=0; }
{ if ( flg == 1 ) print $0; }’ > 結果ファイル名
今回は、awkのほんのさわり部分ですので、極めればもっといろんなことができます。
(私も極めているわけではないですが・・・)
環境があればぜひ触れてみてください。