テキスト処理
awk
フィールド(列)単位でテキストを処理するプログラミング言語。ログ解析や集計に強力
SYNTAX
awk [options] 'program' [file...] 基本概念
awk はテキストの各行を フィールド(列) に分割して処理する。
| 変数 | 意味 |
|---|---|
$0 | 行全体 |
$1 $2 … | 1番目、2番目… のフィールド |
NF | フィールドの総数 |
NR | 現在の行番号 |
FS | フィールドセパレータ(デフォルト: 空白) |
OFS | 出力フィールドセパレータ |
主なオプション
| オプション | 説明 |
|---|---|
-F <sep> | フィールドセパレータを指定(例: -F, で CSV) |
-v var=val | 変数を事前に設定 |
-f <file> | awk プログラムをファイルから読む |
基本構文
awk 'パターン { アクション }' file
- パターンを省略するとすべての行に適用
- アクションを省略するとマッチした行を
print
使用例
# 各行の1番目のフィールドを表示
awk '{print $1}' file.txt
# CSV の2列目を表示
awk -F, '{print $2}' data.csv
# スペース区切りのログから3列目と5列目を表示
awk '{print $3, $5}' access.log
# 特定パターンにマッチした行のみ処理
awk '/ERROR/ {print $0}' app.log
# 3列目が 200 の行のみ表示(HTTPステータスコードでフィルタ)
awk '$3 == 200 {print $0}' access.log
# 最後のフィールドを表示
awk '{print $NF}' file.txt
# 行番号付きで表示
awk '{print NR": "$0}' file.txt
BEGIN と END
# ヘッダとフッタを追加しながら集計
awk 'BEGIN { print "=== 処理開始 ==="; sum=0 }
{ sum += $1 }
END { print "合計:", sum }' numbers.txt
集計の例
# 2列目の合計を計算
awk '{sum += $2} END {print sum}' data.txt
# 各カテゴリ(1列目)の出現回数をカウント
awk '{count[$1]++} END {for (k in count) print k, count[k]}' log.txt
# アクセスログからステータスコード別の件数を集計
awk '{count[$9]++} END {for (s in count) print s, count[s]}' access.log | sort -k1
if 文の例
# 数値が 100 以上の行のみ表示
awk '$1 >= 100 {print $0}' data.txt
# 偶数行のみ表示
awk 'NR % 2 == 0 {print}' file.txt