今回はLinuxコマンドであるawkコマンドについて解説します
テキスト処理やデータ抽出に非常に強力なコマンドです
ログ解析やCSV処理など、実際の現場で大活躍するのでぜひ覚えて帰ってくださいね!
※注 本文の△は半角スペースに置き換えてください。わかりやすくするために△で記述してます
awkコマンドとは??
awkコマンドは、テキストファイルを行単位で処理し、パターンマッチングや計算を行うコマンドです
「Aho, Weinberger, Kernighan」の頭文字から名付けられ、テキスト処理に特化したプログラミング言語的な機能を持ちます
ログファイルの解析、CSV処理、レポート生成などで威力を発揮する高機能なツールです
awkコマンドの主なオプション
awkコマンドには多くの便利なオプションがあります
[table “” not found /]-F (–field-separator)
フィールド区切り文字を指定するオプション
デフォルトは空白やタブですが、CSVファイルの処理ではカンマを指定することが多いです
awk△-F’,’△'{print△$1}’△file.csv
-v (–assign)
変数に値を代入するオプション
awk内で使用する変数を外部から設定できます
awk△-v△name=”John”△'{print△name,△$0}’△file.txt
-f (–file)
AWKスクリプトファイルを指定するオプション
複雑な処理を外部ファイルに記述して実行できます
awk△-f△script.awk△input.txt
-W (–traditional)
従来のAWK互換モードで実行するオプション
POSIX AWKの動作を保証したい場合に使用します
awk△-W△traditional△'{print△$1}’△file.txt
基本的な使い方
awkコマンドでは、パターンとアクションを組み合わせてテキストを処理します
基本的な構文は「awk△’パターン{アクション}’△ファイル名」となります
awk△'{print}’△file.txt
ファイル全体を表示(catと同様)
awk△'{print△$1}’△file.txt
各行の1番目のフィールドを表示
awk△'{print△NF}’△file.txt
各行のフィールド数を表示
awk△'{print△NR,△$0}’△file.txt
行番号付きで表示
フィールド処理
awkの最も強力な機能の一つがフィールド処理です
各行を自動的にフィールドに分割して処理できます
フィールド変数
$0 # 行全体
$1 # 1番目のフィールド
$2 # 2番目のフィールド
$NF # 最後のフィールド
$(NF-1) # 最後から2番目のフィールド
フィールド処理例
# CSV形式のファイル処理
awk△-F’,’△'{print△$2}’△data.csv
# 2列目のみ表示# スペース区切りのログファイル処理
awk△’{print△$1,△$4}’△access.log
# 1列目と4列目を表示
# 最後のフィールドを取得
awk△’{print△$NF}’△file.txt
# 各行の最後のフィールドを表示
組み込み変数
awkには便利な組み込み変数が多数用意されています
NR # 現在の行番号
NF # 現在行のフィールド数
FS # フィールド区切り文字
RS # レコード区切り文字
OFS # 出力フィールド区切り文字
ORS # 出力レコード区切り文字
FILENAME # 現在処理中のファイル名
FNR # ファイル内での行番号
パターンマッチング
特定の条件に一致する行のみを処理することができます
正規表現パターン
# 特定の文字列を含む行を抽出
awk△’/ERROR/’△logfile.txt# 行頭が数字で始まる行を処理
awk△’/^[0-9]/’△file.txt
# 特定のフィールドが条件に一致
awk△’$3△~/^192.168/’△access.log
# 3番目のフィールドが192.168で始まる行
条件パターン
# 特定のフィールドが数値条件に一致
awk△’$2△>△100’△file.txt
# 2番目のフィールドが100より大きい# 複数条件の組み合わせ
awk△’$1==“ERROR”△&&△$3>50’△log.txt
# 1番目が”ERROR”かつ3番目が50より大きい
# フィールド数による条件
awk△’NF>3’△file.txt
# フィールド数が3より多い行
awkコマンドの実用的な活用例
実際の現場でよく使われるawkコマンドの活用例をご紹介します
ログ解析での活用
システム管理でよく使われるログファイルの解析例です
# アクセスログのIPアドレス集計
awk△'{count[$1]++}△END{for(ip△in△count)△print△count[ip],△ip}’△access.log△|△sort△-nr# エラーログの時間別集計
awk△’/ERROR/{print△$2}’△error.log△|△cut△-d:△-f1△|△sort△|△uniq△-c
# レスポンスサイズの統計
awk△’{size+=$10;△count++}△END{print△”Average:”,△size/count,△”Total:”,△size}’△access.log
# 特定期間のログ抽出
awk△’$4△>=△”[01/Jan/2024”△&&△$4△<=△”[31/Jan/2024”’△access.log
CSV処理での活用
データ分析やレポート作成でのCSVファイル処理例です
# 売上データの集計
awk△-F’,’△’NR>1{sales+=$3}△END{print△”Total△Sales:”,△sales}’△sales.csv# 条件に一致するレコードの抽出
awk△-F’,‘△’$2==“Tokyo”△{print△$1,△$3}’△customers.csv
# 列の順序変更
awk△-F’,‘△’{print△$3”,”$1”,”$2}’△input.csv△>△output.csv
# データの検証(欠損値チェック)
awk△-F’,‘△’$2==”“△{print△”Empty△field△in△line”,△NR}’△data.csv
レポート生成での活用
システムレポートや統計情報の生成例です
# ディスク使用量レポート
df△-h△|△awk△’NR>1{print△$5,△$6}’△|△sort△-nr# プロセス監視レポート
ps△aux△|△awk△’$3>1.0{print△$2,△$3,△$11}’△|△sort△-k2△-nr
# メモリ使用量の統計
free△|△awk△’/^Mem/{printf△”Memory△Usage:△%.1f%%\n”,△$3/$2*100}’
# 接続数の統計
netstat△-an△|△awk△’/ESTABLISHED/{count++}△END{print△”Active△connections:”,△count+0}’
高度な機能
awkの高度な機能を活用した複雑な処理例です
配列の活用
# 単語の出現回数をカウント
awk△'{for(i=1;i<=NF;i++)△count[$i]++}△END{for(word△in△count)△print△word,△count[word]}’△file.txt# ユーザー別のファイルサイズ集計
ls△-l△|△awk△’NR>1{size[$3]+=$5}△END{for(user△in△size)△print△user,△size[user]}’
# 月別売上集計
awk△-F’,‘△’{month=substr($1,1,7);△sales[month]+=$3}△END{for(m△in△sales)△print△m,△sales[m]}’△sales.csv
組み込み関数
# 文字列操作
awk△'{print△length($0),△$0}’△file.txt # 行の長さを表示
awk△'{print△substr($1,1,3)}’△file.txt # 最初の3文字を抽出
awk△'{print△toupper($1)}’△file.txt # 大文字に変換# 数学関数
awk△’{print△sqrt($1)}‘△numbers.txt # 平方根を計算
awk△’{sum+=$1}△END{print△”Average:”,△sum/NR}’△numbers.txt # 平均値を計算
# 時刻処理
awk△’{print△strftime(”%Y-%m-%d”,△systime())}’ # 現在日時をフォーマット
制御構造
# if-else文
awk△'{if($3>100)△print△”High:”,△$0;△else△print△”Low:”,△$0}’△file.txt# for文によるループ
awk△’{for(i=1;i<=NF;i++)△printf△”Field%d:%s△”,i,$i;△print△””}’△file.txt
# while文によるループ
awk△’{i=1;△while(i<=NF){print△i,$i;△i++}}’△file.txt
# switch文(gawk拡張)
gawk△’{switch($1){case△”ERROR”:△print△”Error△found”;△break;△default:△print△”Normal”}}’△log.txt
AWKスクリプトファイル
複雑な処理は外部ファイルに記述することで再利用性が向上します
# report.awk
BEGIN△{
△△print△”=== System△Report ===”
△△print△”Date:”,△strftime(“%Y-%m-%d△%H:%M:%S”)
△△print△””
}{
△△total_size△+=△$5
△△file_count++
△△if△($5△>△max_size)△{
△△△△max_size△=△$5
△△△△max_file△=△$NF
△△}
}
END△{
△△printf△”Total△files:△%d\n”,△file_count
△△printf△”Total△size:△%d△bytes\n”,△total_size
△△printf△”Average△size:△%.2f△bytes\n”,△total_size/file_count
△△printf△”Largest△file:△%s△(%d△bytes)\n”,△max_file,△max_size
}
# 実行
ls△-l△|△awk△-f△report.awk
awkコマンドの効率的な使い方
パフォーマンスを向上させるためのコツです
# 1. 早期終了でパフォーマンス向上
awk△’/target/{print;△exit}’△large_file.txt
# 最初に見つかったら終了# 2. 適切なフィールド区切り文字の指定
awk△-F’[△\t]+‘△’{print△$1}’△file.txt
# 複数の空白・タブを区切り文字に
# 3. 不要な処理の回避
awk△’NF>0{process()}△/^#/{next}’△file.txt
# コメント行をスキップ
# 4. 大きなファイルの処理
awk△’FNR%1000==0{print△”Processing△line”,△FNR}’△huge_file.txt
# 進捗表示
よく使われるパターン集
実際の作業でよく遭遇するパターンをまとめました
# 1. 行番号付きで表示
awk△'{print△NR”:”$0}’△file.txt# 2. 重複行の除去
awk△’!seen[$0]++’△file.txt
# 3. 空行の除去
awk△’NF’△file.txt
# 4. 列の合計計算
awk△’{sum+=$1}△END{print△sum}’△numbers.txt
# 5. 最大値・最小値の検索
awk△’NR==1{max=min=$1}△$1>max{max=$1}△$1<min{min=$1}△END{print△”Max:”,max,“Min:”,min}’△numbers.txt
# 6. 特定の列でソート(数値)
awk△’{print△$2,△$0}‘△file.txt△|△sort△-n△|△cut△-d’△’△-f2-
# 7. JSONライクなデータの抽出
awk△-F’”‘△’/name/{print△$4}’△data.json
トラブルシューティング
awkコマンド使用時によくある問題と解決法です
文字エンコーディング問題
# UTF-8での処理
LANG=C.UTF-8△awk△'{print}’△japanese_file.txt# 文字化け対応
iconv△-f△SJIS△-t△UTF-8△file.txt△|△awk△’{print}’
# バイト数での処理
awk△’{print△length($0),△$0}’△LANG=C△file.txt
メモリ使用量の問題
# 大量データの段階的処理
split△-l△10000△huge_file.txt△chunk_
for△chunk△in△chunk_*;△do△awk△’処理’△”$chunk”;△done# 配列の適切な使用
awk△’{if(++count[$1]>threshold)△delete△count[$1]}’△file.txt
# ストリーミング処理
tail△-f△logfile△|△awk△’{print△strftime(”%Y-%m-%d△%H:%M:%S”),△$0}’
まとめ
いかがでしたでしょうか
今回はawkコマンドについてまとめてみました
awkコマンドはテキスト処理に特化したLinuxの強力なコマンドで、システム管理、ログ解析、データ処理において欠かせないツールです
パターンマッチング、フィールド処理、配列操作など、プログラミング言語的な機能を活用することで、複雑なテキスト処理を簡潔に記述できます
sedやgrepと組み合わせることで、さらに高度なテキスト処理パイプラインを構築できるので、ぜひマスターしてください!