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 directorywebterm.appこのサイト
ターミナル基礎
よく使うコマンドを学ぶ
learn.webterm.app別のサイト
