「AWKプログラム」は、「パターン−アクション規則」と「関数定義」の並びである。
パターン{アクション}パターン−アクション規則や関数定義の前後に空行を挿入してもよい。関数定義はどこに記述してもよい。
入力レコードをひとつ読む度に、パターン−アクション規則のパターンが順に検査される。パターン−アクション規則は、パターンが真となるレコードに対して、対応するアクションが実行される。
パターンあるいは{アクション}のいずれかを省略することができる。パターンを省略するとすべてのレコードにアクションが実行され、{アクション}を省略するとパターンが真となるレコードを表示する。
「パターン」は次のいずれかである。
「アクション」は文の並びである。
文は次のいずれかである。
文は改行か';'で区切る。';'が単独で用いられると、空文を表す。文の前後には空行を挿入してもよい。
長い文は、行末に'\'を置いて次行に続けることができる。", { && || do else"のあと、および"if( )","for( )"のあとは、'\'を置かずに改行しても継続とみなされる。
制御文は次のいずれかである。
if-else文において、最初の文がelseと同じ行にある場合、この文は';'で終了するか"{ }"で囲まなければならない。
| 文の種類 | 記法 |
|---|---|
| 逐次構造(文の並び) | {文1; 文2; ... 文n} |
| 選択構造(if文) | if(式) 文 |
| 選択構造(if-else文) | if(式) 文1 else 文2 |
| ループ構造(for文) | for(式1; 式2; 式3) 文 |
| ループ構造(while文) | while(式) 文 |
| ループ構造(do-while文) | do 文 while(式) |
入出力文は次のとおりである。
| getline | 入力レコードを"$0"にセット |
|---|---|
| getline 式 | 0または1 |
| 文の種類 | 書式 | 戻り値 |
|---|---|---|
| 比較 | 式>=式 | 0または1 |
| 式!=式 | 0または1 | |
| 式==式 | 0または1 | |
| 配列要素 | 式 in 式 | 0または1 |
| パターンの検査 | 式~/正規表現/ | 0または1 |
| 式!~/正規表現/ | 0または1 | |
| 和 | 式+式 | 演算結果 |
| 差 | 式-式 | 演算結果 |
| 積 | 式*式 | 演算結果 |
| 商 | 式/式 | 演算結果 |
| 剰余 | 式%式 | 演算結果 |
| 累乗 | 式^式 | 演算結果 |
| +式 | ||
| -式 | ||
| (式) | ||
| 文字列連接 | 文字式 文字式 | 文字列 |
次の組み込み変数が用意されている。
| 組み込み変数 | 値 |
|---|---|
| ARGC | コマンド行の引数の数 |
| ARGV | コマンド行の引数の配列 |
| FILENAME | 現在の入力ファイル名 |
| ENVIRON["..."] | 環境変数の値 |
| FS | 入力のフィールドセパレータ(はじめはスペースまたはタブ) |
| RS | 入力のレコードセパレータ(はじめは改行) |
| NF | 現在レコードのフィールド数 |
| NR | 現在の通算レコード |
| FNR | 現在の入力ファイルの通算レコード |
| OFS | 表示のフィールドセパレータ(はじめはスペース) |
| ORS | 表示のレコードセパレータ(はじめは改行) |
| OFMT | 数の表示のフォーマット(はじめは"%.6g") |
| RSTART | matchでマッチした文字列の開始位置 |
| RLENGTH | matchでマッチした文字列の長さ |
| $0 | 現在の入力レコード |
| $1,...,$NF | 第1フィールド,...,第NFフィールド |
| 組み込み文字列変数 | 値 |
|---|---|
| gsub(r,s,t) | 文字列tの中に現れる文字列rをすべて文字列sで置換する.置換した数を返す.tを省略すると$0が使われる. |
| index(s,t) | 文字列sの中の文字列tの位置を返す.tが現れない場合は0. |
| jindex(s,t) | 日本語文字列sの中の文字列tの位置を返す.tが現れない場合は0. |
| length(s) | 文字列sの長さを返す. |
| jlength(s) | 日本語文字列sの長さを返す. |
| match(s,r) | 文字列sが文字列rにマッチする位置を返す.マッチしないときは0. |
| split(s,a,fs) | fsをフィールドセパレータとして文字列sを配列aに分解し、フィールド数を返す. |
| sprintf(書式,式) | 書式で整えた式の並びを返す. |
| sub(r,s,t) | gsub()と同様.ただしはじめの1回だけ置換する. |
| substr(s,i,n) | 文字列sのi番目から始まるn文字を返す. |
| jsubstr(s,i,n) | 日本語文字列sのi番目から始まるn文字を返す. |
| 組み込み算術変数 | 値 |
|---|---|
| atan2(y,x) | atan(y/x)で-π〜πの値. |
| sin(x) | sin関数 |
| cos(x) | cos関数 |
| exp(x) | exp関数 |
| log(x) | 自然対数 |
| sqrt(x) | 平方根 |
| int(x) | 小数点以下を切り捨て |
| rand() | 疑似乱数 0以上1未満 |
| srand() | 乱数の初期化 |
printfとsprintfの中では次のような変換が利用できる。ここでは例で示す。
| 記法 | 値 |
|---|---|
| printf("|%c|",65) | |A| |
| printf("|%d|",65) | |65| |
| printf("|%5d|",65) | | 65| |
| printf("|%05d|",65) | |00065| |
| printf("|%f|",65) | |65.000000| |
| printf("|%5.1f|",65) | | 65.0| |
| printf("|%e|",65) | |6.500000e+01| |
| printf("|%5.1e|",65) | |6.5e+01| |
| printf("|%g|",65) | |65| |
| printf("|%o|",65) | |101| |
| printf("|%s|","hirosaki") | |hirosaki| |
| printf("|%10s|","hirosaki") | | hirosaki| |
| printf("|%-10s|","hirosaki") | |hirosaki | |
| printf("|%.4s|","hirosaki") | |hiro| |
| printf("|%10.4s|","hirosaki") | | hiro| |
| printf("|%-10.4s|","hirosaki") | |hiro | |
| printf("|%%|") | |%| |
例で正規表現の記法を示す。通常これらの組み合わせとなる。
| 記法 | 値 |
|---|---|
| A | Aそのもの(以下の特殊文字を除く普通の文字) |
| \\ | \そのもの |
| \" | "そのもの |
| \t | タブ |
| \n | 改行 |
| \f | フォームフィード |
| \b | バックスペース |
| \033 | 8進数033 |
| ^a | 文字列の先頭が'a' |
| a$ | 文字列の末尾が'a' |
| . | 任意の1文字 |
| [abc] | 'a''b''c'のどれか1文字 |
| [^abc] | 'a''b''c'以外の1文字 |
| [a-e] | 'a''b''c''d''e'のどれか1文字 |
| [^a-e] | 'a''b''c''d''e'以外の1文字 |
| a* | 0個以上の'a'の並び |
| a+ | 1個以上の'a'の並び |
| a? | 'a'が1個あるいは0個 |
| abc|de | "abc"または"de" |