awkコマンドの使い方:列指向でテキストを処理する
awkは、テキストを空白などで区切って「列」として扱い、条件に合う行の抽出や、列ごとの集計を行うコマンドです。ログやコマンド出力から特定の列だけ取り出す場面でよく使います。
awkのよく使う形
実務や学習で登場しやすい使い方を、そのまま入力できる形でまとめました。
| コマンド例 | 内容 |
|---|---|
awk '{print $1}' file | 各行の1列目を表示 |
awk -F: '{print $1}' /etc/passwd | 区切り文字を:に指定して1列目を表示 |
awk '$3 > 100' file | 3列目が100より大きい行を表示 |
awk '{sum += $2} END {print sum}' file | 2列目の合計を計算して表示 |
df -h | awk 'NR>1 {print $5, $6}' | 他のコマンドの出力から使用率とマウント先を抜き出す |
awk '/error/ {print $0}' app.log | 「error」を含む行を表示 |
awkの主なオプション
| オプション | 意味 |
|---|---|
| {print $1} 列を指定 | |
-F | 区切り文字を指定 |
| BEGIN{...}・END{...} 処理前後に実行 | |
-v | 変数に値を代入 |
awkの実行例と結果の読み方
user@linux-study:~$ awk -F: '{print $1}' /etc/passwd
root
daemon
user
awk -F: '{print $1}'で、/etc/passwdを「:」区切りで分割し、各行の1列目(ユーザー名)だけを取り出して表示しています。cutと似ていますが、awkはより複雑な条件処理も可能です。
練習用ターミナルでは、awkをブラウザ上で安全に試せます。
awkを使うときの注意点
$0は行全体、$1・$2…は各列、NFは列の数、NRは行番号を表します。$NFと書くと、行の最後の列を取れます。
シェルの中でawkのプログラムを書くときは、全体をシングルクォートで囲みます。ダブルクォートだと$1がシェルの変数として先に展開されてしまいます。
awkに関するよくある質問
cutとの違いは?
cutは区切り文字が固定の単純な列抽出向きです。連続するスペースの扱いや、条件・計算が必要なときはawkが向いています。
カンマ区切りのCSVを扱うには?
awk -F, '{print $2}' file.csvのように区切り文字を指定します。引用符の中にカンマがあるCSVは、専用ツールのほうが確実です。
関連ページ
あわせて覚えたいコマンド:sed・grep・cut・sort
awkが登場する章:中級 第7章