ログや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
行を数えるだけなら END で NR を出すか、素直に wc -l でも構いません。
awk 'END {print NR}' access.log
対になる BEGIN { } は「1行目を読む前」に動くので、見出しの出力などに使えます。
grep・sed・jqとの使い分け
テキスト処理系のコマンドは、役割で覚えると迷いません。
なお、相手が整ったJSONなら、列で切るawkより jq のほうが素直に扱えます。使い分けの参考にどうぞ。
最後に
awkは $1 と -F、そして END の3つを押さえるだけで、日々のログやCSVの確認がぐっと速くなります。
まずは手元のファイルで awk '{print $1}' から試してみてください。
以上です。







