Linuxコマンド一覧

awkコマンド|列を取り出して条件で絞り、集計する

__ __ _ _____
\ \ / /__| |_|_ _|__ _ __ _ __ ___
\ \ /\ / / _ \ '_ \| |/ _ \ '__| '_ ` _ \
\ V V / __/ |_) | | __/ | | | | | |
\_/\_/ \___|_.__/|_|\___|_| |_| |_| |_
 
awk を試すためのサンドボックスです。実機のファイルには影響しません。
user@webterm:~/project$
 

awk は行を列に分けて処理するコマンドです。`$1` で列を取り出す書き方、条件で行を絞る書き方、`END` で合計を出す書き方を、ブラウザ上のターミナルで打ちながら確認できます。

最終更新: 2026-09-06

書式

awk '条件 { 処理 }' ファイル

各行を空白で列に分け、条件に合った行に処理を行います。

まず打ってみる

各行の1列目(IP アドレス)を取り出します。

$ cat logs/access.log
10.0.0.1 /index 200 512
10.0.0.2 /missing 404 128
10.0.0.1 /index 200 640
10.0.0.3 /boom 500 96
10.0.0.2 /index 200 512
$ awk '{print $1}' logs/access.log
10.0.0.1
10.0.0.2
10.0.0.1
10.0.0.3
10.0.0.2

$1 が1列目、$2 が2列目です。 カンマで並べると、間に空白が入って出ます。

$ awk '{print $1, $3}' logs/access.log
10.0.0.1 200
10.0.0.2 404
10.0.0.1 200
10.0.0.3 500
10.0.0.2 200

列数が行によって違うときは、$NF(最後の列)が便利です。

$ awk '{print $NF}' logs/access.log
512
128
640
96
512

条件で絞る

波かっこの前に条件を書くと、その行だけが対象になります。

$ awk '$3 == 200 {print $1}' logs/access.log
10.0.0.1
10.0.0.1
10.0.0.2

処理を省くと、条件に合った行がそのまま出ます。

$ awk '$3 == 200' logs/access.log
10.0.0.1 /index 200 512
10.0.0.1 /index 200 640
10.0.0.2 /index 200 512

数の大小でも絞れます。 これは grep にはできないことです。

$ awk '$4 > 500 {print $2, $4}' logs/access.log
/index 512
/index 640
/index 512

文字で絞りたいときは、スラッシュで囲みます。

$ awk '/index/ {print $1}' logs/access.log
10.0.0.1
10.0.0.1
10.0.0.2

合計と件数

END { ... } は、全部の行を読み終わったあとに1回だけ実行されます。

$ awk '{sum += $4} END {print sum}' logs/access.log
1888

各行で $4 を足しておき、最後に合計を出しています。 行数だけなら NR を出します。

$ awk 'END {print NR}' logs/access.log
5

NR はいま何行目かを表すので、見出しを飛ばすのにも使えます。

区切り文字を変える

CSV には -F を付けます。

$ awk -F, 'NR > 1 {print $2, $3}' users.csv
ada web
linus infra
grace infra

NR > 1 で見出し行を落としています。

実務での使いどころ

awk は、列を見ながら条件をかけたいときに打つコマンドです。

場面打ち方
特定の列だけ取り出すawk '{print $1}' access.log
条件に合う行だけ処理するawk '$3 == 500 {print $2}' access.log
数の大小で絞るawk '$4 > 500' access.log
合計を出すawk '{sum += $4} END {print sum}' access.log
CSV の列を扱うawk -F, '{print $2}' users.csv

cut との使い分けは単純です。 取り出すだけなら cut、条件や計算が要るなら awk です。

つまずきやすいところ

スクリプトはシングルクォートで囲みます。 $1 はシェルにとっても意味のある書き方なので、ダブルクォートで囲むとシェルに先に解釈されます。 awk '{print $1}' と、必ずシングルクォートで囲んでください。

空白の数は気にしなくて構いません。 awk は連続した空白をまとめて1つの区切りとして扱います。 桁をそろえるために空白が並んだログでも、そのまま $3 で3列目を取れます。

取り出して数える流れは、そのままつながります。

$ awk '{print $1}' logs/access.log | sort | uniq -c | sort -nr
      2 10.0.0.2
      2 10.0.0.1
      1 10.0.0.3

列を取り出して数える、という流れは awk と sort uniq の組み合わせで完結します。

ファイルが無いときは、そう言われます。

$ awk '{print $1}' nothing.log
awk: nothing.log: No such file or directory

手を動かして覚える

webterm.appこのサイト

learn.webterm.app別のサイト

>_WEBTERM LEARN

WebTerm Learn|1つのコマンドから、使える状態へ

コマンドは単体で覚えるより、実際の作業の流れの中で使うほうが身につきます。順番に積み上げていくコースがあります。

コースを見る

関連するコマンド

cut / sed / grep / sort

よくある質問

awk と cut はどう使い分けますか?
列をそのまま取り出すだけなら `cut` が簡単です。条件で絞る、順番を入れ替える、合計する、のいずれかが要るなら awk です。
`$1` や `$NF` は何ですか?
`$1` は1列目、`$2` は2列目です。`$NF` は最後の列、`$0` は行そのものを指します。列数そのものは `NF` で取れます。
`NR` とは何ですか?
いま何行目かです。`NR > 1` で見出し行を飛ばす、`END {print NR}` で行数を数える、といった使い方をします。
波かっこの前に条件だけ書くとどうなりますか?
条件に合った行がそのまま出ます。`awk '$3 == 200'` は `grep` のような使い方になります。
区切りがカンマのときはどうしますか?
`-F,` を付けます。`awk -F, '{print $2}' users.csv` のように、区切り文字を先に伝えてから列を指定します。