こちらからSWELLを購入できます 詳しくはこちら

【Linux】awkコマンド完全ガイド テキスト処理、データ抽出に使えるコマンド

  • URLをコピーしました!

今回は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ファイル処理例です

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と組み合わせることで、さらに高度なテキスト処理パイプラインを構築できるので、ぜひマスターしてください!

この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次