テキスト処理

awk

フィールド(列)単位でテキストを処理するプログラミング言語。ログ解析や集計に強力

SYNTAX awk [options] 'program' [file...]

基本概念

awk はテキストの各行を フィールド(列) に分割して処理する。

変数意味
$0行全体
$1 $21番目、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