ファイル操作

Linux awkコマンド入門|テキストの加工と集計処理

Linux awk テキスト処理

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を使いましょう。