grepやawkコマンドでログの調査をする

grepawkコマンドで、ログファイルから欲しい情報を取得する!

ログファイルの中身を調査したい時に使えるコマンドをメモとして残します。

結論

以下のようなコマンドを使ってログファイルから検索/閲覧を行います。

gzip -dc /var/log/access.log-20231203.gz | grep '500 Internal Server Error' | awk -F ' ' '{print $2, $3, $4, $5}' | wc -l

grepコマンド

grep 検索ワード ファイル名と書きます。

grep '500 Internal Server Error' log/test.log

パイプを使って書くこともできます。

cat log/test.log | grep '500 Internal Server Error' 

-eオプション:複数の検索文字列を指定したい時に使用します。

grep -e '500 Internal Server Error' -e '400 Bad Request' log/test.log

-Eオプション:正規表現で“または”という意味の「|」記号使って指定することもできます。(上記-eオプションと同じ結果が得られる。)

grep -E '500 Internal Server Error|400 Bad Request' log/test.log

awkコマンド

入力として受け取った文字列に対して、区切り文字を指定したり加工したりできるコマンドです。

cat log/test.log | grep '500 Internal Server Error' | awk '{print $0}'

-Fオプション:区切り文字を指定することができます。デフォルトはスペース' 'です。タグ区切り("\t")などあります。

cat log/test.log | grep '500 Internal Server Error' | awk -F ' ' '{print $0}'
Completed 500 Internal Server Error in 200ms (ActiveRecord: 0.3ms)

awkコマンドで取得できるのは改行ごとです。
全体をレコードと呼び、-Fオプションで区切られたものをフィールドと言います。
レコード全体には $0 変数が割り当てられ、レコード最初のフィールドには $1 変数が割り当てられます。

cat log/test.log | grep '500 Internal Server Error' | awk -F ' ' '{print $1}'
Completed

$2 変数は2つ目のフィールドが割り当てられていることがわかります。

cat log/test.log | grep '500 Internal Server Error' | awk -F ' ' '{print $2}'
500

wcコマンド

入力として受け取った文字列に対して、行数や単語数、文字数を数えるコマンドです。
例えば以下のような出力結果が得られているとします。

cat log/test.log | grep '500 Internal Server Error' | awk -F ' ' '{print $2, $3, $4, $5}'
500 Internal Server Error
500 Internal Server Error
500 Internal Server Error

wcコマンドの-lオプションを指定すると3が出力されます。
3回ログファイルに「500 Internal Server Error」が出力されていることがわかります。
だけ欲しい場合に役に立ちそうです。

cat log/test.log | grep '500 Internal Server Error' | awk -F ' ' '{print $2, $3, $4, $5}' | wc -l
3

圧縮されている場合

通常、サーバ上のログファイルは圧縮された状態で格納されているかと思います。
例えばgz圧縮されている場合、解凍せずにファイルの中身を閲覧したい時、gzip -dcコマンドを使います。

gzip -dc /var/log/nginx/access.log-20231203.gz | grep '500 Internal Server Error'