はじめに

こんにちは!今回はawkコマンドについて解説します。

awkは、テキスト処理の超強力なコマンドです。列の抽出、計算、条件分岐、集計など、プログラミング言語のようなことができます。ちょっと難しいですが、使えるようになると作業効率が劇的に上がります。

awkコマンドとは

awkは、テキストをパターンマッチングして処理するプログラミング言語です。

各行をフィールド(列)に分割して、それぞれに対して処理を実行できます。cutやgrepより高機能で、sedより読みやすく、データ処理に特化したコマンドです。

基本構文

1
awk 'パターン {アクション}' ファイル名

または

1
awk -F'区切り文字' '{アクション}' ファイル名

基本的な概念

  • $0: 行全体
  • $1, $2, $3…: 1列目、2列目、3列目…
  • NR: 現在の行番号
  • NF: 現在の行のフィールド数
  • FS: フィールド区切り文字(デフォルトはスペース/タブ)
  • OFS: 出力フィールド区切り文字

使用例

例1: 特定の列を表示

1
2
3
4
5
6
# data.txt の内容
# Alice 30 Tokyo
# Bob 25 Osaka
# Charlie 35 Kyoto

awk '{print $1}' data.txt

実行結果:

1
2
3
Alice
Bob
Charlie

1列目(名前)だけ表示。

1
awk '{print $1, $3}' data.txt

実行結果:

1
2
3
Alice Tokyo
Bob Osaka
Charlie Kyoto

1列目と3列目を表示。

例2: カンマ区切り(CSV)の処理

1
2
3
4
5
6
# users.csv の内容
# Alice,30,Tokyo
# Bob,25,Osaka
# Charlie,35,Kyoto

awk -F',' '{print $1, $2}' users.csv

実行結果:

1
2
3
Alice 30
Bob 25
Charlie 35

-F','でカンマ区切りを指定。

例3: 条件に合う行だけ表示

1
awk '$2 > 28' data.txt

実行結果:

1
2
Alice 30 Tokyo
Charlie 35 Kyoto

2列目(年齢)が28より大きい行だけ表示。

1
awk '$3 == "Tokyo"' data.txt

実行結果:

1
Alice 30 Tokyo

3列目が"Tokyo"の行だけ表示。

例4: 計算を行う

1
2
3
4
5
6
# scores.txt の内容
# Alice 80 90
# Bob 75 85
# Charlie 90 95

awk '{print $1, ($2 + $3) / 2}' scores.txt

実行結果:

1
2
3
Alice 85
Bob 80
Charlie 92.5

2列目と3列目の平均を計算。

例5: 合計を計算

1
2
3
4
5
6
# prices.txt の内容
# 100
# 200
# 150

awk '{sum += $1} END {print sum}' prices.txt

実行結果:

1
450

すべての値の合計を表示。

例6: 行番号を表示

1
awk '{print NR, $0}' data.txt

実行結果:

1
2
3
1 Alice 30 Tokyo
2 Bob 25 Osaka
3 Charlie 35 Kyoto

NRは現在の行番号。

例7: 最後の列を表示

1
awk '{print $NF}' data.txt

実行結果:

1
2
3
Tokyo
Osaka
Kyoto

$NFは最後のフィールド。

例8: パターンマッチング

1
awk '/Tokyo/ {print $1}' data.txt

実行結果:

1
Alice

“Tokyo"を含む行の1列目を表示。

例9: BEGIN と END

1
awk 'BEGIN {print "Name Age"} {print $1, $2} END {print "Total:", NR}' data.txt

実行結果:

1
2
3
4
5
Name Age
Alice 30
Bob 25
Charlie 35
Total: 3
  • BEGIN: 最初に1回だけ実行
  • 中央部分: 各行で実行
  • END: 最後に1回だけ実行

例10: 出力フィールド区切り文字を変更

1
awk 'BEGIN {OFS=","} {print $1, $2, $3}' data.txt

実行結果:

1
2
3
Alice,30,Tokyo
Bob,25,Osaka
Charlie,35,Kyoto

出力をカンマ区切りに変更。

例11: 複数の条件

1
awk '$2 > 25 && $3 == "Tokyo"' data.txt

実行結果:

1
Alice 30 Tokyo

ANDやOR条件が使えます。

例12: 文字列の長さ

1
awk '{print $1, length($1)}' data.txt

実行結果:

1
2
3
Alice 5
Bob 3
Charlie 7

実践的な使い方

ログファイルからエラーをカウント

1
awk '/ERROR/ {count++} END {print "Errors:", count}' app.log

CSVファイルの特定列の合計と平均

1
awk -F',' '{sum += $3; count++} END {print "合計:", sum, "平均:", sum/count}' data.csv

アクセスログからIPアドレスを集計

1
awk '{ip[$1]++} END {for (i in ip) print ip[i], i}' access.log | sort -rn | head -10

最もアクセスの多いIPトップ10。

ファイルサイズの合計

1
ls -l | awk '{sum += $5} END {print sum, "bytes"}'

複数列の合計

1
awk '{for(i=2; i<=NF; i++) sum+=$i} END {print sum}' numbers.txt

2列目以降すべての合計。

条件に応じた処理

1
2
3
4
5
awk '{
  if ($2 >= 90) print $1, "Excellent"
  else if ($2 >= 70) print $1, "Good"
  else print $1, "Need improvement"
}' scores.txt

重複行をカウント(連想配列)

1
awk '{count[$0]++} END {for (line in count) print count[line], line}' file.txt | sort -rn

フィールドの並び替え

1
awk '{print $3, $2, $1}' data.txt

列の順序を変更。

特定の行範囲を抽出

1
awk 'NR >= 10 && NR <= 20' file.txt

10行目から20行目まで表示。

CSVをTSVに変換

1
awk -F',' 'BEGIN {OFS="\t"} {print $1, $2, $3}' data.csv

欠損値をスキップ

1
awk '$2 != "" {print $1, $2}' data.txt

2列目が空でない行だけ処理。

グループ集計

1
2
3
4
5
6
7
# data.txt の内容
# Tokyo 100
# Osaka 200
# Tokyo 150
# Osaka 250

awk '{sum[$1] += $2} END {for (city in sum) print city, sum[city]}' data.txt

実行結果:

1
2
Tokyo 250
Osaka 450

都市ごとの合計。

よく使うパターン

パターン1: 列の抽出と計算

1
awk '{print $1, $2 * 1.1}' prices.txt

2列目を10%増しで表示。

パターン2: ヘッダー行をスキップ

1
awk 'NR > 1 {print $1, $2}' data.csv

1行目(ヘッダー)をスキップ。

パターン3: 空行をスキップ

1
awk 'NF > 0' file.txt

フィールド数が0より大きい行(空行以外)。

パターン4: 複数ファイルの処理

1
awk '{sum += $1} END {print FILENAME, sum}' file1.txt file2.txt

パターン5: 正規表現マッチ

1
awk '/^[0-9]/ {print $0}' file.txt

数字で始まる行のみ。

awkとcutの使い分け

1
2
3
4
5
6
# cutが適している(シンプルな列抽出)
cut -d ',' -f 1,3 data.csv

# awkが適している(計算や条件が必要)
awk -F',' '$2 > 30 {print $1, $3}' data.csv
awk -F',' '{print $1, $2 * 1.1}' data.csv

基本的には:

  • シンプルな列抽出 → cut
  • 条件・計算・集計 → awk

Tips・注意点

  • フィールド番号は1から: 0ではない($0は行全体)

    1
    
    awk '{print $1}'  # 最初のフィールド
    
  • デフォルトの区切り文字: スペースとタブ(複数スペースも1つの区切りとして扱う)

    1
    2
    
    awk '{print $1}'  # スペース/タブで分割
    awk -F',' '{print $1}'  # カンマで分割
    
  • 文字列と数値: 自動で型変換される

    1
    
    awk '{print $1 + $2}'  # 数値として扱われる
    
  • printf で書式指定: printfを使うと桁揃えができる

    1
    
    awk '{printf "%-10s %5d\n", $1, $2}' data.txt
    
  • 変数の初期値: 数値は0、文字列は空文字列

    1
    
    awk '{sum += $1} END {print sum}'  # sumは自動的に0から始まる
    

まとめ

今回はawkコマンドについて解説しました。

ポイント:

  • awkで高度なテキスト処理ができる
  • $1, $2...で各列を参照
  • -Fで区切り文字を指定
  • 条件分岐や計算が可能
  • 連想配列で集計ができる
  • BEGINENDで前後処理
  • NR, NF, $NFなどの特殊変数が便利

awkは最初は難しく感じますが、慣れるとログ解析やデータ処理が超速くなります。まずは簡単な列抽出から始めて、徐々に計算や条件分岐を使ってみてください。

次回もLinuxコマンドの学習を続けていきましょう!