あえて言うほどではないけれども、awkの区切り文字について

こんにちは、河野です。

保守業務でログを分割して一部のフィールドを閲覧・集計することがありますが、そんなときはawkが活躍しますね。今回はawkの使い方を紹介します。

まずはawkの基本をおさらい

awkスクリプトの書式

awkは、何を実行するかawkスクリプトを記述する必要があります。

こういったブロックを複数記述することができ、入力されたテキスト行が条件に一致したときにブロックが実行されます。
良く見かけるのは、

というものですが、これは条件を省略していることになります。入力されたテキストの全行に対して実行するということですね。

また特殊な条件として、BEGIN, ENDがあり、それぞれ最初と最後に1度だけ実行されます。実行前の初期設定を行ったり、最終的な集計結果を出力したりという使い方ができます。

実行形式ファイルにする

また、実行形式のファイルとして記述することもできます。

実行は、

といった感じです。

区切り文字を変更する

区切り文字を変更するには -F オプションを使います。

例:CSVのアンケート結果から一部だけ出力

区切り文字には正規表現も使えますので、複数文字の区切り文字にも対応できます。

例:アクセスログから時刻だけ取得

ちょっとややこしい使い方

アクセスログから、日付、IP、UserAgentを取得したい!という時があります。

先ほどから度々登場しているaccess_logを使います。区切り文字に、カギ括弧にスペースを使えば問題なさそうですね。

上手く行ってそうですが、ところが…

違う日のログでは上手く行きません。UserAgentは複数のスペースを含むので、フィールドの数が変わってしまい過不足が出てしまいます。スペースで区切るのが良くないようです。

行の中で出てくる固定の文字列としては、カギ括弧か、ダブルクオートです。ダブルクオートではIPが上手く区切れませんね。

こんな時には、awkのsplit関数を使いましょう!
カギ括弧とダブルクオートで分割すると、1つめのフィールドにIPなどが入ります。これをさらにスペースで分割するという方法です。

先ほどとは出力が異なりますが、欲しい情報は取得できました!

awkが使いこなせるとログ調査とか捗りますので、日々精進したいですね。

Comments are closed, but you can leave a trackback: Trackback URL.