みなさんこんにちは!
最近、クラウドの発達によって、以前よりオンプレでの開発機会が少なくなってきましたね。
元々UnixやLinuxでガリガリ開発していた身としては、少々寂しさもありつつ、便利な世の中になったな、と思うところもあります。
初心に返る意味も込めて、昔よく使ってたコマンドの記事を書こうと思います。
awkコマンド
今回は、awkコマンドです。
IT業界に入って最初のプロジェクトがインフラだったので、とてもお世話になりました。
先輩方と一緒にターミナルに向かいながらしのぎを削ってたのは、今となっては懐かしい思い出です。
awsコマンドとは
テキスト処理のためのプログラミング言語で、シェルスクリプトと組み合わせて使われることが多いです。私がよく利用していたケースには以下のものがあります。
-
ログファイルの解析
システムログやアプリケーションログなど、定形フォーマットのログファイルを解析し、情報を抽出。
今回は、最もよく利用したアクセスログの解析について書こうと思います。
アクセスログ
以下は、Webサーバのアクセスログの例です。各行は一つのリクエストを表し、IPアドレス、日時、リクエストメソッド、URL、ステータスコード、応答サイズなどの情報が含まれています。
192.168.1.1 [01/Jan/2023:10:00:00 +0000] "GET /index.html HTTP/1.1" 200 512
192.168.1.2 [01/Jan/2023:10:05:00 +0000] "POST /login.php HTTP/1.1" 200 244
192.168.1.1 [01/Jan/2023:10:10:00 +0000] "GET /about.html HTTP/1.1" 200 768
192.168.1.3 [01/Jan/2023:10:15:00 +0000] "GET /aaa.html HTTP/1.1" 404 0
ここで、200は正常、404はNot Foundですね。
awkとシェルを使った簡易的な集計
先ほどのアクセスログから、IPアドレスとリクエストURLを抽出し、それぞれのIPアドレスからのリクエスト数を集計してみましょう。
awk '{print $1, $7}' access.log | sort | uniq -c | sort -nr
このコマンドを順番に見ていきましょう。
awk '{print $1, $7}' access.log
各行からIPアドレス(1つめのフィールド)とリクエストURL(7つめのフィールド)を抽出。
| sort
抽出したデータをソートします。
ここで「|」はパイプと呼ばれ、前の結果をキャッシュして次のコマンドに渡す。
| uniq -c
重複する行(同じIPとURLの組み合わせ)をカウント。
| sort -nr
リクエストの多い順に並び替えます。
実行結果
$ awk '{print $1, $7}' access.log | sort | uniq -c | sort -nr
2 192.168.1.1 200
1 192.168.1.3 404
1 192.168.1.2 200
192.168.1.1からのリクエストは2件、それ以外は1件という結果になりました。
ちゃんと集計できていましたね!
このように、コマンドをうまく組み合わせることで、簡単に集計ができます。
今でもたまに利用しているので、みなさんもぜひ、コマンドの楽しさを体験してください!