awk入門|テキストを列で切り出す・集計する基本

awk入門|テキストを列で切り出す・集計する基本

ログやCSVを眺めていて、「この列だけ抜き出したい」「この数値を合計したい」と思うことがあります。

grepは行を絞るのが得意ですが、行の中の“何列目”を取り出したり足し合わせたりするのは苦手です。

本記事では、テキストを列(フィールド)単位で切り出して集計する awk の基本を、コピペで試せる形で整理します。

awkは「1行を列に分ける」道具

awkは、入力を1行ずつ受け取り、それを空白区切りで列(フィールド)に分けて処理する仕組みです。

列は先頭から $1$2… と番号で呼び、$0 は行全体を指します。

行番号は NR、その行の列数は NF という変数で参照できるのです。

多くのLinux・macOSには最初から入っているので、インストール不要で試せるのも気軽なところです。

まずは列を取り出す($1・$NF)

スペース区切りの行から、必要な列だけを表示してみます。

echo "2026-07-12 INFO ログイン成功" | awk '{print $1}'
# => 2026-07-12

$NF は「最後の列」を意味するので、列数が変わっても末尾を狙えます。

echo "2026-07-12 INFO ログイン成功" | awk '{print $NF}'
# => ログイン成功

カンマ区切りで複数の列を並べると、その順で出力されます。

echo "apple 120 3" | awk '{print $1, $3}'
# => apple 3

区切り文字を変える(-F)

CSVのようにカンマ区切りのデータは、-F で区切り文字を指定します。

awk -F',' '{print $2}' data.csv

-F を省くと、awkは連続する空白(スペースやタブ)をまとめて1つの区切りとして扱います。

条件で行を絞る(パターン)

awkは パターン { アクション } の形で、条件に合う行だけ処理できるのです。

スラッシュで囲むと正規表現マッチになり、grepのような使い方ができます。

awk '/ERROR/ {print $0}' app.log

数値の比較も書けるので、「3列目が100より大きい行」だけを取り出せます。

awk -F',' '$3 > 100' sales.csv

先頭のヘッダー行を飛ばしたいときは、行番号 NR で条件を付けます。

awk 'NR > 1' data.csv

合計・カウントする(BEGIN・END)

END { } は「全行を読み終えたあと」に1回だけ動くブロックです。ここで集計結果を出します。

awk -F',' '{sum += $3} END {print sum}' sales.csv

行を数えるだけなら ENDNR を出すか、素直に wc -l でも構いません。

awk 'END {print NR}' access.log

対になる BEGIN { } は「1行目を読む前」に動くので、見出しの出力などに使えます。

grep・sed・jqとの使い分け

テキスト処理系のコマンドは、役割で覚えると迷いません。

  • grep … 条件に合う「行」を探す
  • sed … 行の中身を「置換」する
  • awk … 行を「列」に分けて抜き出す・集計する

なお、相手が整ったJSONなら、列で切るawkより jq のほうが素直に扱えます。使い分けの参考にどうぞ。

jq入門|JSONをコマンドラインで整形・抽出する基本

最後に

awkは $1-F、そして END の3つを押さえるだけで、日々のログやCSVの確認がぐっと速くなります。

まずは手元のファイルで awk '{print $1}' から試してみてください。

以上です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA