Linuxのawkコマンド徹底解説:基本から応用まで

Linux

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

処理の流れ

  1. 各行でsum += $2を実行(sumに2列目の値を足す)
  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で見やすい形式に変換

学習のステップ

  1. 基本操作をマスター:列の表示、条件抽出
  2. パターンマッチングを覚える:正規表現の活用
  3. 集計処理を理解:BEGIN・ENDパターンの使用
  4. 実際の業務に適用:ログ解析、データ処理

コメント

タイトルとURLをコピーしました