Linux awkコマンド入門
テキストの加工と集計処理
awkコマンドでテキストデータのフィールド抽出、加工、集計を行う方法を基礎から実践まで解説します。
こんな人向けの記事です
- テキストデータの特定の列を抽出・加工したい方
- ログファイルやCSVデータの集計処理を行いたい方
- シェルスクリプトでのテキスト処理を効率化したい方
Step 1awkコマンドの基本
awkは行とフィールド(列)を単位にテキストを処理するプログラミング言語です。各行を自動的にフィールドに分割し、特定の列を抽出・加工できます。
ターミナル
# 基本構文
awk 'パターン {アクション}' ファイル名
# 特定のフィールド(列)を表示
awk '{print $1}' file.txt # 1列目を表示
awk '{print $1, $3}' file.txt # 1列目と3列目を表示
awk '{print $NF}' file.txt # 最後の列を表示
# 行全体を表示
awk '{print $0}' file.txt # 全行表示(catと同じ)
# パイプラインで使用
ls -l | awk '{print $5, $9}' # サイズとファイル名
フィールド変数: $1=1列目、$2=2列目、$NF=最後の列、$0=行全体、NR=行番号、NF=フィールド数
Step 2フィールドの抽出と加工
区切り文字の指定やフィールドの加工方法を説明します。
ターミナル
# 区切り文字を指定(-F)
awk -F: '{print $1, $3}' /etc/passwd # コロン区切り
awk -F, '{print $1, $2}' data.csv # カンマ区切り
awk -F' ' '{print $1}' data.tsv # タブ区切り
# 出力区切り文字を指定(OFS)
awk -F: 'BEGIN{OFS=","} {print $1, $3}' /etc/passwd
# フォーマット出力(printf)
awk '{printf "%-10s %5d
", $1, $2}' file.txt
# フィールドの結合
awk '{print $1 "-" $2}' file.txt
# 行番号を付ける
awk '{print NR, $0}' file.txt
| 組み込み変数 | 説明 |
|---|---|
$0 | 行全体 |
$1, $2... | 1番目、2番目のフィールド |
NR | 現在の行番号 |
NF | 現在の行のフィールド数 |
FS | 入力フィールド区切り文字 |
OFS | 出力フィールド区切り文字 |
FILENAME | 現在処理中のファイル名 |
Step 3条件付き処理とパターン
特定の条件に一致する行のみを処理する方法を説明します。
ターミナル
# 文字列パターンでフィルタ
awk '/error/' log.txt # "error"を含む行
awk '!/comment/' file.txt # "comment"を含まない行
# 条件式でフィルタ
awk '$3 > 100 {print $1, $3}' data.txt # 3列目が100より大きい行
awk '$1 == "admin"' users.txt # 1列目がadminの行
awk 'NR >= 5 && NR <= 10' file.txt # 5行目から10行目
# BEGIN/ENDブロック
awk 'BEGIN{print "=== レポート ==="} {print $0} END{print "=== 終了 ==="}' file.txt
# 複数条件
awk '$2 > 50 && $3 < 100' data.txt
awk '$1 == "A" || $1 == "B"' data.txt
BEGIN/END: BEGINは処理開始前に1回実行、ENDは処理終了後に1回実行されます。ヘッダー表示や集計結果の出力に便利です。
Step 4集計と計算
awkの強力な計算機能を使った集計処理について説明します。
ターミナル
# 合計の計算
awk '{sum += $2} END{print "合計:", sum}' data.txt
# 平均の計算
awk '{sum += $2; count++} END{print "平均:", sum/count}' data.txt
# 最大値・最小値
awk 'NR==1{max=$2} $2>max{max=$2} END{print "最大:", max}' data.txt
# グループ別集計
awk '{sum[$1] += $2} END{for(k in sum) print k, sum[k]}' data.txt
# 行数カウント
awk 'END{print NR}' file.txt
# 重複除去
awk '!seen[$0]++' file.txt
注意: awkの変数は初期化なしで使えます(数値は0、文字列は空文字で自動初期化)。ただし、意図しない動作を避けるためBEGINブロックで明示的に初期化するのがベストプラクティスです。
Step 5実践的な使用例
日常業務でよく使用されるawkの実践例を紹介します。
ターミナル
# ディスク使用量の集計
df -h | awk 'NR>1 {print $5, $6}' # 使用率とマウントポイント
# プロセスのメモリ使用量
ps aux | awk '{sum += $6} END{print "Total:", sum/1024, "MB"}'
# /etc/passwdからユーザー一覧
awk -F: '$3 >= 1000 {print $1}' /etc/passwd
# CSVの特定列を抽出
awk -F, '{print $1","$3}' input.csv > output.csv
# アクセスログのIP別カウント
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
# ログからエラー行を時間付きで抽出
awk '/ERROR/ {print $1, $2, $0}' app.log
awkとcutの使い分け: 単純な列抽出ならcutが高速です。条件付き処理や計算が必要な場合はawkを使いましょう。