Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

awk

『awk』はテキストをフィールド(列)単位で処理するプログラミング言語です。CSVやログファイルの集計・抽出・変換など、構造化テキストの処理で強力な能力を発揮します。

構文
awk [オプション] 'プログラム' [ファイル...]
awk -F 区切り文字 'プログラム' [ファイル...]
構文・変数一覧
構文 / 変数概要
'{print $1}'1番目のフィールドを表示します($0 は行全体)。
-F ':'フィールド区切り文字を指定します(デフォルトは空白)。
NR現在処理中の行番号です。
NF現在行のフィールド数です。$NF で最後のフィールドを参照できます。
FSフィールド区切り文字(Field Separator)です。
OFS出力フィールド区切り文字(Output Field Separator)です。
RSレコード区切り文字(Record Separator、デフォルトは改行)です。
BEGIN { }ファイルを読む前に1度だけ実行されるブロックです。
END { }ファイルを読み終えた後に1度だけ実行されるブロックです。
/パターン/ { }パターンに一致する行にのみ処理を適用します。
サンプルコード

以下のファイルを例に説明します。

# scores.txt の内容:
# alice 85 Tokyo
# bob 92 Osaka
# charlie 78 Tokyo
# diana 95 Nagoya
# eve 88 Osaka

# sales.csv の内容:
# name,amount,region
# alice,1200,east
# bob,800,west
# charlie,1500,east

各行の1番目のフィールドを表示します。

awk '{print $1}' scores.txt
alice
bob
charlie
diana
eve

条件を指定して、2列目が90以上の行のみ表示します。

awk '$2 >= 90' scores.txt
bob 92 Osaka
diana 95 Nagoya

条件に一致した行の特定フィールドだけを表示します。

awk '$2 >= 90 {print $1, $2}' scores.txt
bob 92
diana 95

『NR』で行番号付きで表示します。

awk '{print NR": "$0}' scores.txt
1: alice 85 Tokyo
2: bob 92 Osaka
3: charlie 78 Tokyo
4: diana 95 Nagoya
5: eve 88 Osaka

『END』ブロックで数値を合計します(2列目を合計)。

awk '{sum += $2} END {print "Total:", sum}' scores.txt
Total: 438

『-F』で区切り文字を指定してCSVを処理します。

awk -F',' '{print $1, $2}' sales.csv
name amount
alice 1200
bob 800
charlie 1500

『BEGIN』と『END』を使ってヘッダー・フッターを付けます。

awk 'BEGIN{print "=== Results ==="} {print $1, $2} END{print "=== End ==="}' scores.txt
=== Results ===
alice 85
bob 92
charlie 78
diana 95
eve 88
=== End ===

パターンに一致する行を処理します(3列目が『Tokyo』の行のみ)。

awk '$3 == "Tokyo" {print $1, $2}' scores.txt
alice 85
charlie 78

連想配列を使って重複を除去します。

awk '{print $3}' scores.txt | awk '!seen[$0]++'
Tokyo
Osaka
Nagoya
概要

『awk』はシェル内で使える小さなプログラミング言語です。変数・条件分岐・ループ・配列・組み込み関数(gsub・split・substr・sprintf など)も使えます。複雑な処理は Python や Perl のほうが読みやすいですが、ワンライナーで済む集計・変換には awk が最速です。

単純な行検索には『grep』を、テキスト置換には『sed』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。