はじめに
こんにちは!今回はawkコマンドについて解説します。
awkは、テキスト処理の超強力なコマンドです。列の抽出、計算、条件分岐、集計など、プログラミング言語のようなことができます。ちょっと難しいですが、使えるようになると作業効率が劇的に上がります。
awkコマンドとは
awkは、テキストをパターンマッチングして処理するプログラミング言語です。
各行をフィールド(列)に分割して、それぞれに対して処理を実行できます。cutやgrepより高機能で、sedより読みやすく、データ処理に特化したコマンドです。
基本構文
|
|
または
|
|
基本的な概念
- $0: 行全体
- $1, $2, $3…: 1列目、2列目、3列目…
- NR: 現在の行番号
- NF: 現在の行のフィールド数
- FS: フィールド区切り文字(デフォルトはスペース/タブ)
- OFS: 出力フィールド区切り文字
使用例
例1: 特定の列を表示
|
|
実行結果:
|
|
1列目(名前)だけ表示。
|
|
実行結果:
|
|
1列目と3列目を表示。
例2: カンマ区切り(CSV)の処理
|
|
実行結果:
|
|
-F','でカンマ区切りを指定。
例3: 条件に合う行だけ表示
|
|
実行結果:
|
|
2列目(年齢)が28より大きい行だけ表示。
|
|
実行結果:
|
|
3列目が"Tokyo"の行だけ表示。
例4: 計算を行う
|
|
実行結果:
|
|
2列目と3列目の平均を計算。
例5: 合計を計算
|
|
実行結果:
|
|
すべての値の合計を表示。
例6: 行番号を表示
|
|
実行結果:
|
|
NRは現在の行番号。
例7: 最後の列を表示
|
|
実行結果:
|
|
$NFは最後のフィールド。
例8: パターンマッチング
|
|
実行結果:
|
|
“Tokyo"を含む行の1列目を表示。
例9: BEGIN と END
|
|
実行結果:
|
|
BEGIN: 最初に1回だけ実行- 中央部分: 各行で実行
END: 最後に1回だけ実行
例10: 出力フィールド区切り文字を変更
|
|
実行結果:
|
|
出力をカンマ区切りに変更。
例11: 複数の条件
|
|
実行結果:
|
|
ANDやOR条件が使えます。
例12: 文字列の長さ
|
|
実行結果:
|
|
実践的な使い方
ログファイルからエラーをカウント
|
|
CSVファイルの特定列の合計と平均
|
|
アクセスログからIPアドレスを集計
|
|
最もアクセスの多いIPトップ10。
ファイルサイズの合計
|
|
複数列の合計
|
|
2列目以降すべての合計。
条件に応じた処理
|
|
重複行をカウント(連想配列)
|
|
フィールドの並び替え
|
|
列の順序を変更。
特定の行範囲を抽出
|
|
10行目から20行目まで表示。
CSVをTSVに変換
|
|
欠損値をスキップ
|
|
2列目が空でない行だけ処理。
グループ集計
|
|
実行結果:
|
|
都市ごとの合計。
よく使うパターン
パターン1: 列の抽出と計算
|
|
2列目を10%増しで表示。
パターン2: ヘッダー行をスキップ
|
|
1行目(ヘッダー)をスキップ。
パターン3: 空行をスキップ
|
|
フィールド数が0より大きい行(空行以外)。
パターン4: 複数ファイルの処理
|
|
パターン5: 正規表現マッチ
|
|
数字で始まる行のみ。
awkとcutの使い分け
|
|
基本的には:
- シンプルな列抽出 →
cut - 条件・計算・集計 →
awk
Tips・注意点
-
フィールド番号は1から: 0ではない($0は行全体)
1awk '{print $1}' # 最初のフィールド -
デフォルトの区切り文字: スペースとタブ(複数スペースも1つの区切りとして扱う)
1 2awk '{print $1}' # スペース/タブで分割 awk -F',' '{print $1}' # カンマで分割 -
文字列と数値: 自動で型変換される
1awk '{print $1 + $2}' # 数値として扱われる -
printf で書式指定: printfを使うと桁揃えができる
1awk '{printf "%-10s %5d\n", $1, $2}' data.txt -
変数の初期値: 数値は0、文字列は空文字列
1awk '{sum += $1} END {print sum}' # sumは自動的に0から始まる
まとめ
今回はawkコマンドについて解説しました。
ポイント:
awkで高度なテキスト処理ができる$1, $2...で各列を参照-Fで区切り文字を指定- 条件分岐や計算が可能
- 連想配列で集計ができる
BEGINとENDで前後処理NR,NF,$NFなどの特殊変数が便利
awkは最初は難しく感じますが、慣れるとログ解析やデータ処理が超速くなります。まずは簡単な列抽出から始めて、徐々に計算や条件分岐を使ってみてください。
次回もLinuxコマンドの学習を続けていきましょう!