Linuxでデータ処理をする際、強力なツールとして知られるのが「awk」です。
テキストファイルの解析やデータの抽出、整形出力などに活用できるこのコマンドは、使いこなせば日常の作業効率が格段に向上します。
こんな作業で困っていませんか?
- CSVファイルから特定の列だけを取り出したい
- ログファイルからエラー行だけを抽出したい
- 数値データの合計を素早く計算したい
本記事ではawkの基本的な使い方から、実用的な応用例まで丁寧に解説します。
awkとは?

awkって何?
awKは、行単位でテキストを処理するスクリプト言語です。
各行をフィールド(列)に分解して、条件に応じた処理を行うのが特徴です。
名前の由来 awkという名前は、開発者3人の頭文字から取られています:
- Aho(エイホ)
- Weinberger(ワインバーガー)
- Kernighan(カーニハン)
どんなときに使うの?
よくある使用場面
- ログ解析:エラーログから特定の情報を抽出
- データ変換:CSVファイルの特定列を取得
- レポート作成:数値データの集計と整形
- テキスト整形:ファイルの内容を見やすく加工
基本構文
awk 'パターン { アクション }' ファイル名
構文の説明
- パターン:どの行を処理するかの条件
- アクション:その行に対して何をするか
- ファイル名:処理したいファイル
簡単な例
awk '{ print }' sample.txt
これは「すべての行を表示する」という意味です。
構文の基本を押さえれば、応用にもスムーズに進めます。次は、よく使う基本例を見ていきましょう。
awkの基本的な使い方
フィールド(列)について理解しよう
awkでは、各行をスペースやタブで区切った部分を「フィールド」と呼びます。
例:sample.txtの内容
田中 25 東京
佐藤 30 大阪
山田 28 福岡
この場合:
$1
:1列目(名前)$2
:2列目(年齢)$3
:3列目(住所)$0
:行全体
指定列の表示
1列目だけを表示
awk '{ print $1 }' sample.txt
実行結果
田中
佐藤
山田
複数列を表示
awk '{ print $1, $2 }' sample.txt
実行結果
田中 25
佐藤 30
山田 28
区切り文字の指定
デフォルトでは空白やタブで列を分けますが、CSVファイルのようにカンマで区切られたファイルもあります。
CSVファイルの例:data.csv
名前,年齢,住所
田中,25,東京
佐藤,30,大阪
カンマ区切りで2列目を表示
awk -F"," '{ print $2 }' data.csv
実行結果
年齢
25
30
-F
オプションの説明
- Field separator(フィールド区切り文字)の略
-F","
でカンマを区切り文字に指定
条件付き抽出
特定の条件を満たす行だけを処理できます。
年齢が30以上の人だけ表示
awk '$2 >= 30 { print $1, $2 }' sample.txt
実行結果
佐藤 30
比較演算子一覧
>
:より大きい>=
:以上<
:より小さい<=
:以下==
:等しい!=
:等しくない
基本操作をマスターすることで、必要なデータを効率よく抽出できます。次は便利なパターンマッチング機能を紹介します。
パターンマッチングと条件指定

文字列を含む行を抽出
特定の文字列を含む行だけを表示できます。
「エラー」を含む行を表示
awk '/エラー/ { print }' log.txt
ログファイルの例:log.txt
2024-12-06 10:00:01 正常処理
2024-12-06 10:05:15 エラー:ファイルが見つかりません
2024-12-06 10:10:30 正常処理
2024-12-06 10:15:45 エラー:メモリ不足
実行結果
2024-12-06 10:05:15 エラー:ファイルが見つかりません
2024-12-06 10:15:45 エラー:メモリ不足
正規表現を使った条件指定
より柔軟な条件指定ができます。
1列目が「2024」で始まる行を表示
awk '$1 ~ /^2024/ { print }' log.txt
正規表現の記号
^
:行の始まり$
:行の終わり.*
:任意の文字列[0-9]
:数字~
:マッチする!~
:マッチしない
応用例:メールアドレスを含む行
awk '/[@]/ { print }' contacts.txt
複数条件の組み合わせ
AND条件(&&)
awk '$2 > 25 && $3 == "東京" { print $1 }' sample.txt
「年齢が25より大きく、かつ住所が東京の人の名前」
OR条件(||)
awk '$2 > 30 || $3 == "福岡" { print $1 }' sample.txt
「年齢が30より大きい、または住所が福岡の人の名前」
複雑な条件でもシンプルに書けるのがawkの魅力です。次は、さらに実践的な応用例を紹介します。
応用:集計や整形出力
数値の集計
2列目の合計値を算出
awk '{ sum += $2 } END { print "合計:", sum }' data.txt
データファイルの例:data.txt
商品A 100
商品B 200
商品C 150
実行結果
合計: 450
処理の流れ
- 各行で
sum += $2
を実行(sumに2列目の値を足す) END
で全行処理後に合計を表示
平均値の計算
awk '{ sum += $2; count++ } END { print "平均:", sum/count }' data.txt
実行結果
平均: 150
最大値・最小値の取得
awk 'BEGIN { max = 0 } $2 > max { max = $2 } END { print "最大値:", max }' data.txt
整形出力
printf を使った整形
awk '{ printf "商品: %-10s 価格: %5d円\n", $1, $2 }' data.txt
実行結果
商品: 商品A 価格: 100円
商品: 商品B 価格: 200円
商品: 商品C 価格: 150円
printfの書式指定
%-10s
:左詰めで10文字幅の文字列%5d
:右詰めで5桁の整数\n
:改行
カウント処理
特定条件の行数をカウント
awk '$2 > 100 { count++ } END { print "100円より高い商品:", count "個" }' data.txt
行番号を付ける
awk '{ print NR ":", $0 }' sample.txt
実行結果
1: 田中 25 東京
2: 佐藤 30 大阪
3: 山田 28 福岡
NRとは
- Number of Record(レコード番号)
- 現在処理している行番号
実用的なテクニック
BEGIN・ENDパターン
BEGIN:ファイル処理前に実行 END:ファイル処理後に実行
awk 'BEGIN { print "=== 売上レポート ===" }
{ total += $2 }
END { print "総売上:", total "円" }' sales.txt
複数ファイルの処理
awk '{ sum += $2 } END { print "合計:", sum }' file1.txt file2.txt
変数を使った処理
awk -v threshold=1000 '$2 > threshold { print $1 }' data.txt
-v
オプション
- 外部から変数を渡すときに使用
threshold=1000
で変数thresholdに1000を設定
CSVファイルの特定列抽出
月別売上データから特定月のデータを抽出
awk -F"," '$1 == "2024-12" { sum += $3 } END { print "12月売上:", sum }' sales.csv
注意点とコツ

よくある間違い
間違い1:比較演算子
# 間違い
awk '$2 = 30 { print }' sample.txt
# 正しい
awk '$2 == 30 { print }' sample.txt
間違い2:文字列の比較
# 間違い
awk '$1 = "田中" { print }' sample.txt
# 正しい
awk '$1 == "田中" { print }' sample.txt
パフォーマンスのコツ
早期終了
# 最初の10行だけ処理
awk 'NR <= 10 { print }' large_file.txt
条件を先に書く
# 効率的
awk '$2 > 1000 && $1 ~ /^A/ { print }' data.txt
デバッグのコツ
処理内容を確認
awk '{ print "処理中:", NR, $0; sum += $2 } END { print "結果:", sum }' data.txt
便利な組み込み変数
- NR:現在の行番号
- NF:現在行のフィールド数
- FILENAME:処理中のファイル名
- FS:フィールド区切り文字
awk '{ print "ファイル:", FILENAME, "行:", NR, "列数:", NF }' sample.txt
まとめ
awkは一見難しそうに見えますが、慣れると非常にパワフルで柔軟なツールです。
この記事の要点
- 基本構文:
awk 'パターン { アクション }' ファイル名
- フィールド指定:
$1
,$2
,$3
で列を指定 - 条件指定:比較演算子や正規表現で柔軟な抽出
- 集計機能:合計、平均、最大値などの計算
- 整形出力:printfで見やすい形式に変換
学習のステップ
- 基本操作をマスター:列の表示、条件抽出
- パターンマッチングを覚える:正規表現の活用
- 集計処理を理解:BEGIN・ENDパターンの使用
- 実際の業務に適用:ログ解析、データ処理
コメント