列処理 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: です。

動作の図解

diagram (will load when visible)

基本の例

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 }' 450

BEGIN / 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 は単純な集計やフィールド抽出なら cutpaste より柔軟です。条件分岐や変数を含めた複雑な処理が必要になったら、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 10

CSV のヘッダーをスキップしたいときは NR > 1 を条件に置くだけで済みます。

まとめ

  • awk は行と列を意識したテキスト処理
  • $1, $2, ..., $NF でフィールド指定、-F で区切り変更
  • パターン (条件式や正規表現) を付けて行を絞れる
  • BEGIN / END で集計や見出しを出せる
  • if / NR と組み合わせれば軽いレポートも書ける

次のレッスン

次は パイプ活用:実践的なコマンド連携 で、テキスト処理に便利なawkコマンドで、列を抽出・加工する実践的な操作を学びます を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. awk の基本 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. awk の基本 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

課題

  1. echo でデータを作る
  2. awk を使う
  3. 2 列目だけ出力

ヒント

script.sh
script.sh
学習モード
script.sh
ターミナル出力