列処理 awk
列処理 awk とは
テキスト処理に便利なawkコマンドで、列を抽出・加工する実践的な操作を学びます。本レッスンでは、列処理 awk の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
なぜ重要か
awk は「行と列を意識したテキスト処理」のためのツールであり、それ自体が小さなプログラミング言語でもあります。スペースやタブで区切られたデータから 2 列目だけ取り出す、特定列の値を合計する、条件に応じて列を組み替えるといった操作が、簡潔な記述で書けます。CSV やログのように「決まった構造のテキスト」を扱う場面で、awk は非常に強力です。
名前は開発者 3 人の頭文字 (Aho、Weinberger、Kernighan) を並べたものです。歴史は古いものの、現在も標準コマンドとして全 Linux ディストリビューションに搭載されています。
基本構文
ターミナル
awk 'パターン { アクション }' ファイルパターンが一致した行に対し、アクション部分を実行します。パターンを省略すると全行、アクションを省略すると行をそのまま表示します。
フィールドとレコード
awk は入力をレコード (行) に分け、各レコードをフィールド (列) に分割します。
| 変数 | 意味 |
|---|---|
$0 | 行全体 |
$1, $2, ... | 1 列目、2 列目 ... |
NF | 列数 |
NR | 現在の行番号 |
FS | フィールド区切り文字 (既定は空白) |
区切りを変更するには -F オプションを使います。CSV なら -F,、/etc/passwd なら -F: です。
動作の図解
基本の例
2 列目だけ表示するには次のように書きます。
ターミナル
$ echo -e "alice 30\nbob 25\ncarol 28" | awk '{ print $2 }'
30
25
28/etc/passwd のような区切り付きデータも簡単に扱えます。
ターミナル
$ awk -F: '{ print $1 }' /etc/passwd | head -3
root
daemon
binパターンと条件
パターン部分には正規表現や条件式が書けます。
ターミナル
$ echo -e "alice 30\nbob 25\ncarol 28" | awk '$2 >= 28 { print $1 }'
alice
carol年齢が 28 以上の名前だけを抜き出しています。
合計と計算
awk は変数や算術演算が使える本格的な言語です。END ブロックで集計結果を出すパターンが定番です。
ターミナル
$ echo -e "apple 100\nbanana 200\ncherry 150" | awk '{ sum += $2 } END { print sum }'
450BEGIN / END は入力処理の前後に 1 度だけ実行されるブロックです。ヘッダー出力や集計結果に使えます。
ターミナル
$ awk 'BEGIN { print "name age" } { print $1, $2 }' data.txt
awkは浮動小数の計算も標準で扱えます。電卓代わりにawk 'BEGIN { print 1/3 }'のような用途でも便利です。
区切り変更の活用
ログから特定の列だけ抽出する例です。スペース区切りのアクセスログから、最終列のステータスコードを抜き出します。
ターミナル
$ echo '192.168.1.1 - - [01/Jan] "GET / HTTP/1.1" 200' | awk '{ print $NF }'
200$NF は「最後のフィールド」を意味します。列数が可変のデータでも、最後の列を確実に取れるのが便利です。
printf による整形
print だけでなく printf も使え、書式指定子で整形できます。
ターミナル
$ echo -e "alice 30\nbob 25" | awk '{ printf "%-10s %3d\n", $1, $2 }'
alice 30
bob 25
awkは単純な集計やフィールド抽出ならcutやpasteより柔軟です。条件分岐や変数を含めた複雑な処理が必要になったら、awkで書く方が短く済みます。
やってみよう
演習では echo で「名前 年齢」のリストを作り、awk で 2 列目 (年齢) だけを取り出します。$1 や $2 の感覚をつかんでください。
複数アクションと if 文
awk は if / else / while を持つ小さな言語なので、簡単な条件分岐も書けます。
ターミナル
$ echo -e "alice 30\nbob 17\ncarol 28" | awk '{ if ($2 >= 20) print $1, "adult"; else print $1, "minor" }'
alice adult
bob minor
carol adultワンライナーの中に if を埋め込めるので、簡易レポートやデータ振り分けの場面で役立ちます。
NR と組み合わせる
NR は処理中の行番号です。「先頭 5 行をスキップ」「100 行ごとに 1 件サンプリング」といった操作に使えます。
ターミナル
$ seq 1 10 | awk 'NR > 5'
6
7
8
9
10CSV のヘッダーをスキップしたいときは NR > 1 を条件に置くだけで済みます。
まとめ
awkは行と列を意識したテキスト処理$1,$2, ...,$NFでフィールド指定、-Fで区切り変更- パターン (条件式や正規表現) を付けて行を絞れる
- BEGIN / END で集計や見出しを出せる
- if / NR と組み合わせれば軽いレポートも書ける
次のレッスン
次は パイプ活用:実践的なコマンド連携 で、テキスト処理に便利なawkコマンドで、列を抽出・加工する実践的な操作を学びます を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- awk の基本 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. awk の基本 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
課題
- echo でデータを作る
- awk を使う
- 2 列目だけ出力