Linux の awk コマンド は、テキストファイルや標準入力を行単位・フィールド単位で処理するためのテキスト処理言語です。
1 行ずつ読み込みながら、「特定の条件に当てはまる行だけ出力する」「特定の列だけ取り出す」「数値を合計して集計する」といった処理を簡潔に書けるのが特徴です。
Web サーバのアクセスログや CSV ファイルの整形など、インフラ運用やログ解析の現場で頻繁に登場する強力なコマンドです。
grep コマンドのような単純な検索では物足りないときに、grep コマンドや sed コマンド とあわせて使われることが多いです。
awk 'パターン { アクション }' ファイル名コマンド | awk 'パターン { アクション }'
awk では、基本的に次のような考え方で処理を書きます。
- 入力は1 行ずつ処理される
- 各行は$1, $2, $3 … といった番号付きのフィールドに分割される(デフォルトは空白区切り)
パターンにマッチする行に対して、{ アクション }で指定した処理を実行する
・特定の列(フィールド)だけを取り出す。
awk '{print $1}' access.log
この例では、各行の 1 列目($1)だけを出力します。
アクセスログから IP アドレスだけ取り出したい場合などにそのまま使えます。
・CSV の特定の列だけを取り出す。
awk -F, '{print $1","$3}' data.csv
-F オプションでフィールド区切り文字をカンマに変更し、1 列目と 3 列目だけを出力しています。
不要な列を落として別のシステムに渡したいときなどに便利です。
・特定の文字列を含む行だけを抽出する。
awk '/ERROR/ {print}' app.log
パターン部分に /ERROR/ を指定することで、「ERROR」という文字列を含む行だけを出力します。
grep と似ていますが、そのまま後続の処理(列の抽出や集計)につなげられるのが awk の強みです。
・3 列目が 100 より大きい行だけを抽出する。
awk '$3 > 100 {print}' data.txt
3 列目を数値として比較し、100 より大きい行だけを出力します。
数値条件でフィルタしたいときは、grep よりも awk が向いています。
・1 列目の数値の合計を計算する。
awk '{sum += $1} END {print sum}' values.txt
各行の 1 列目を sum に足し込んでいき、最後の行の処理が終わったところ(END ブロック)で合計を表示しています。
簡単な集計であれば、わざわざスプレッドシートに持ち込まなくても awk だけで完結できます。
・ステータスコードごとのリクエスト数を集計する(アクセスログ)。
awk '{status[$9]++} END {for (s in status) print s, status[s]}' access.log
この例では、9 列目(ステータスコード)ごとにカウントを増やし、最後にステータスコードと件数を一覧表示しています。
「200 が何件、404 が何件…」といったログのざっくり集計によく使うパターンです。
・IP アドレスごとのアクセス件数を集計する(アクセスログ)。
awk '{cnt[$1]++} END {for (ip in cnt) print ip, cnt[ip]}' access.log
1 列目(IP アドレス)ごとに件数を集計しています。
アクセスが集中している IP をざっくり把握したいときなどに便利です。
・コメント行(先頭が #)を除外して出力する。
awk '!/^#/ {print}' config.txt
先頭が # の行を除外し、それ以外の行だけを表示します。
設定ファイルや CSV からコメント行を取り除きたいときに使える書き方です。
・Web サーバアクセスログの解析
アクセスログから IP アドレスやステータスコード、レスポンスサイズなどを取り出して、
リクエスト数の集計やエラー率の把握をする際によく使われます。
・CSV ファイルの整形・前処理
別システムからエクスポートされた CSV から、
必要な列だけを抽出したり、不要な行を削除したりする前処理に awk はとても相性が良いです。
・しきい値を超えた値だけを通知・抽出する
監視ツールやバッチ処理の中で、特定の数値がしきい値を超えた行だけを抽出し、
メール通知やログ出力につなげる、といった用途にもよく使われます。
・シェルスクリプトの中での軽量な集計
スクリプト内で「合計」「平均」「件数」などの簡単な集計をしたいとき、
awk を 1 行書くだけで済むケースはかなり多いです。
| short option | long option | description |
|---|---|---|
| -F | --field-separator | 入力フィールドの区切り文字を指定する(デフォルトは空白とタブ) |
| -f | --file | awk プログラムを記述したファイルを読み込んで実行する |
| -v | --assign | 変数に値を事前に代入してからスクリプトを実行する |
| -e | --source | コマンドラインからプログラムを文字列として指定する |
| -i | --include | 指定したライブラリファイルを読み込んでからスクリプトを実行する |
| -W | --posix | POSIX 互換モードで動作させ一部の拡張機能を無効にする |
| --help | 利用可能なオプションの一覧を表示して使い方を確認する | |
| --version | awk のバージョン情報を表示して終了する |
より詳細な文法やオプションについては、Linux の
awk マニュアルページ(英語)
などの公式ドキュメントもあわせて参照してください。
単純な文字列検索には grep コマンド、
ログのページ送りには less コマンド など、目的に応じて使い分けると効率的です。
新着情報
ブログランキングに参加しています。クリックして応援していただけると嬉しいです。
