名前 | 形式 | 機能説明 | オプション | オペランド | 入力ファイル | 拡張機能説明 | 使用法 | 使用例 | 環境 | 終了ステータス | 属性 | 関連項目 | 診断 | 注意事項
/usr/bin/nawk と /usr/xpg4/bin/awk の両ユーティリティは、テキストデータ処理専用の nawk プログラミング言語で作成されたプログラムを実行します。 nawk プログラムは、一連のパターンとそれに対応するアクション (動作) から構成されます。 program を指定する文字列は、シェルによって処理されないように、単一引用符 (') で囲まなければなりません。 パターンとアクションの一連の対は、program としてコマンド行で指定できます。または -f progfile オプションで指定する 1 つ以上のファイル内で指定できます。 パターンに一致する入力が読み込まれたとき、そのパターンに対応するアクションが実行されます。
入力は一連のレコードとして解釈されます。 1 レコードはデフォルトでは 1 行ですが、RS 組み込み変数を使用すれば、変更できます。 入力の各レコードが program 内の各パターンと照合されます。 一致したパターンのそれぞれについて、対応するアクションが実行されます。
nawk ユーティリティは、各入力レコードを一連のフィールドとして解釈します。 デフォルトのときフィールドは空白以外の文字列です。 デフォルトの空白フィールド区切り文字 (空白文字、タブ、または両方) は、FS 組み込み変数または -F ERE オプションを使用すれば変更できます。 nawk ユーティリティはレコードの最初のフィールドを $1 、2 番目のフィールドを $2 、(以下同様にみなされる) とみなします。記号 $0 はレコード全体を指します。その他のフィールドを設定すると、$0 が再評価されます。 $0 を割り当てると、すべてのフィールドの値と NF 組込み変数の値がリセットされます。
以下のオプションを指定できます。
入力が読み込まれる前に、入力フィールドの区切り文字が拡張正規表現 ERE であることを定義します (文字も可能) 。
nawk プログラムが入ったファイル progfile のパス名を指定します。このオプションが複数指定された場合は、それらのファイルが指定された順序で連結されて nawk プログラムになります。nawk プログラムは 1 つの引数としてコマンド行に指定することもできます。
assignment 引数は assignment オペランドと同じ形式でなければなりません。代入は var=value の形式です。var は以下に説明する変数の 1 つです。指定された代入は、BEGIN パターンがあればそれに対応する動作も含め、nawk プログラムの実行の前に行われます。このオプションは複数個指定できます。
以下のオペランドを指定できます。
-f オプションを省略すると、nawk への最初のオペランドは nawk プログラムのテキストです。アプリケーションは nawk への単一引数として、program オペランドを提供します。 テキストが復帰改行文字 (NEWLINE) で終わっていない場合でも、nawk は復帰改行文字で終わっているものと解釈します。
以下の 2 つのタイプの argument は混在可能です。
読み込まれる入力が入ったファイルのパス名。プログラム内の一連のパターンと照合されます。file オペランドが指定されない、または – の場合、標準入力が使用されます。
下線または移植性のある 文字セットのアルファベットで始まり、その後に下線、移植可能な文字セットのアルファベット、および = 記号が続くオペランドは、パス名ではなく変数の代入を指定するものです。= 記号より前の文字は、nawk 変数の名前を表します。この名前が nawk の予約語の場合、結果は未定義です。= 記号より後の文字は、nawk プログラム内に二重引用符 (") で囲まれているもの、つまり STRING トークンとして解釈されます。 ただし最後の文字は非エスケープバックスラッシュで、シーケンス "\" の最初の文字ではなく、バックスラッシュという文字そのものとして解釈されます。変数にこの STRING トークンの値が代入されます。値が数値列と考えられる場合、変数には数値が代入されます。このような変数割り当ては、file 指定があればその処理の直前に実行されます。そのため最初の file 引数より前の割り当ては BEGIN アクション (あれば) の後に実行され、最後の file 引数より後の割り当ては END アクション (あれば) の前に実行されます。file 引数がない場合は、標準入力の処理の前に割り当てが実行されます。
以下のソースからの nawk プログラムへの入力ファイルは、テキストファイルでなければなりません。
file オペランドまたはそれと同等 (nawk 変数 ARGV と ARGC を変更して得られる)
標準入力 (file オペランドがない場合)
getline 関数への引数
これらのファイルについて、変数 RS が復帰改行文字以外の値に設定されるかどうかによって、システムでは指定された区切り文字で終わるレコードを {LINE_MAX} バイトまでサポートしたり、もっと長いレコードをサポートすることができます。
-f progfile を指定する場合は、progfile オプション引数のそれぞれが示すファイルは nawk プログラムが入ったテキストファイルでなければなりません。
標準入力が使用されるのは、file オペランドが指定されない場合、または – の場合だけです。
pattern { action }
パターンとアクション (中括弧も含む) のどちらかを省略することもできます。パターン-アクション文は、セミコロンまたは復帰改行文字で区切られます。
パターンを省略すると、入力のどのレコードとも一致します。 アクションを省略すると、入力内の一致するレコードが標準出力に書き出されます。
nawk プログラムの実行は、まずすべての BEGIN パターンに対応するアクションをプログラム内の順序で 実行することによって開始されます。次にレコード区切り文字 (デフォルトでは復帰改行文字) が検出されるまで、各 file オペランド (ファイルを省略した場合は標準入力) が処理され、ファイルからデータが読み取られ、現在の FS 値を使用して現在のレコードがフィールドに分割され、プログラム内の順序で各パターンが評価され、現在のレコードと一致する各パターンに対応するアクションが実行されます。後続のパターンが評価される前に、一致パターンのアクションが実行されます。 最後に、すべての END パターンに対応するアクションがプログラム内の順序で実行されます。
式は、pattern と action で使用される計算を記述します。以下の表では、有効な式演算をグループごとに、優先度の高い順に並べてあります。 優先度が同じ演算子は上下の横線で囲まれています。 構文があいまいな式は、優先度の高い演算子が 優先度の低い演算子よりも先に評価されます。この表の expr、expr1、expr2、および expr3 は任意の式を意味し、lvalue は代入される要素 (つまり代入演算子の左側にあるもの) を表しています。
構文 | 名前 | 結果のタイプ | 結合規則 |
---|---|---|---|
(expr) | グループ分け | expr のタイプ | 該当なし |
$expr | フィールド参照 | 文字列 | 該当なし |
++ lvalue | 前置インクリメント | 数値 | 該当なし |
--lvalue | 前置デクリメント | 数値 | 該当なし |
lvalue ++ | 後置インクリメント | 数値 | 該当なし |
lvalue -- | 後置デクリメント | 数値 | 該当なし |
expr ‸ expr | べき乗 | 数値 | 右 |
! expr | 論理否定 | 数値 | 該当なし |
+ expr | 単項プラス | 数値 | 該当なし |
- expr | 単項マイナス | 数値 | 該当なし |
expr * expr | 乗算 | 数値 | 左 |
expr / expr | 除算 | 数値 | 左 |
expr % expr | 率 | 数値 | 左 |
expr + expr | 加算 | 数値 | 左 |
expr - expr | 減算 | 数値 | 左 |
expr expr | 文字列連結 | 文字列 | 左 |
expr < expr | より小さい | 数値 | なし |
expr <= expr | 等しいまたはより小さい | 数値 | なし |
expr != expr | 等しくない | 数値 | なし |
expr == expr | 等しい | 数値 | なし |
expr > expr | より大きい | 数値 | なし |
expr >= expr | 等しいまたはより大きい | 数値 | なし |
expr ~ expr | ERE 一致 | 数値 | なし |
expr !~ expr | ERE 不一致 | 数値 | なし |
expr in array | 配列のメンバー | 数値 | 左 |
( index ) in | 多次元配列 | 数値 | 左 |
配列 | メンバー | ||
expr && expr | 論理積 | 数値 | 左 |
expr | | expr | 論理和 | 数値 | 左 |
expr1 ? expr2 | 条件式 | 選ばれた expr2 | 右 |
: expr3 | または expr3 のタイプ | ||
lvalue ‸= expr | べき乗 | 数値 | 右 |
代入 | |||
lvalue %= expr | 率代入 | 数値 | 右 |
lvalue *= expr | 乗算 | 数値 | 右 |
代入 | |||
lvalue /= expr | 除算代入 | 数値 | 右 |
lvalue += expr | 加算代入 | 数値 | 右 |
lvalue -= expr | 減算代入 | 数値 | 右 |
lvalue = expr | 代入 | expr のタイプ | 右 |
各式は 1 つの文字列値、数値、または両方を持ちます。すでに触れた特殊な文脈の場合を除き、式の値は、その式を使う文脈に必要な型に自動的に変換されます。文字列値は、以下の呼び出しと等価なものによって、数値に変換されます。
setlocale(LC_NUMERIC, ""); numeric_value = atof(string_value);
整数値の場合は、sprintf() の書式 %d で変換されるのと同じ文字列に変換されます。その他の数値は、書式として CONVFMT の値を使って変換されるのと同じ文字列に変換されます。
以下の場合、文字列値は数値列とみなされます。
先行および末尾の空白文字が無視されます。
無視されない最初の文字が + または – の場合、それは無視されます。
無視されない残りの文字が NUMBER トークンとして認識される場合、文字列は 数値列とみなされます。
上記のステップで – 文字が無視されると、数値列の値は、認識された NUMBER トークンの数値の負の値になります。その他の場合、数値列の値は、認識された NUMBER トークンの数値です。文字列が 数値列かどうかが問題になるのは、この項でその用語が使用されている文脈でだけです。
ブール型の文脈で式が使用されるとき、式に数値がある場合、ゼロは偽 として、その他の値は真 として扱われます。それ以外の場合、空白文字列の文字列値は偽 として、その他の値は真として扱われます。ブール型の文脈は、以下の 1 つです。
条件式の最初の副式 (サブエクスプレッション)
論理否定、論理積、または論理和によって演算される式
for 文の 2 番目の式
if 文の式
while 文または do . . . while 文の while 句の式
パターンとして使用される式 (Overall Program Structure 内のように)
nawk 言語は、数字や文字列を保存するための配列を提供します。 配列は宣言しなければなりません。配列は最初は空で、サイズは動的に変化します。 連想配列機能の一種を提供する添字 (要素識別子) は文字列です。配列名とその後ろにある大括弧内の添字は、構文で説明したように lvalue および式として使用できます。添字のない配列名が使用できるのは、以下の文脈でだけです。
関数定義または関数呼び出し内のパラメータ
キーワード in の後に続く NAME トークン
有効な配列インデックスは、プログラミング言語で多次元配列にインデックスが 付けられる方法と同じように、コンマで区切られた 1 つ以上の式から構成されます。 nawk 配列は 1 次元なので、SUBSEP 変数の値で区切られている個々の式の文字列値を連結することで、コンマで区切られたリストが 1 つの文字列に変換されます。 そのため以下の 2 つのインデックス操作は等しい結果となります。
var[expr1, expr2, ... exprn] var[expr1 SUBSEP expr2 SUBSEP ... SUBSEP exprn]
in 演算子が付いた多次元 インデックスは、括弧で囲まなければなりません。 in 演算子は特定の配列要素の有無を調べ、無い場合は要素を作成しません。 存在しない配列要素へのその他の参照を行うと、要素は自動的に作成されます。
nawk プログラムでは変数を参照することで変数を使用できます。 関数パラメータ以外は、明示的に宣言されません。 初期設定されていないスカラー変数と配列要素は、数値ゼロと NULL 文字列値の両方を持ちます。
フィールド変数は $ とその後に続く数字または数値式によって指定されます。 負でない整数以外と評価されるフィールド番号 expression の動作は未定義です。 初期設定されていない変数や文字列値は、この文脈では 数値に変換される必要はありません。新しいフィールド変数は、値を割り当てることで作成されます。 存在しないフィールド (つまり $NF の後のフィールド) を参照すると、NULL 文字列が生成されます。ただし存在しないフィールドを割り当てると (たとえば $(NF+2) = 5) 、NF の値が増分され、値として NULL 文字列を持つ中間フィールドと $0 の値が再度計算され、OFS の値でフィールドが区切られます。 各フィールド変数には、作成時に文字列値が入ります。 現在のロケールからの小数点文字がピリオドに変更された文字列は、数値列とみなされ (前述の「 nawk 内の式」の項を参照) 、フィールド変数も数値列の値を持つことになります。
nawk は次の特殊変数を設定します。
ARGV 配列内の要素の数。
オプションと program 引数を除いたコマンド行引数の配列。 ゼロから ARGC-1 までの番号がふられます。
ARGV 内の引数は、変更や追加が可能です。 ARGC は変更できます。各入力ファイルが終わると、nawk は現在の ARGC-1 の値まで、ARGV の次の非 NULL 要素を次の入力ファイルの名前として扱います。 ARGV の要素を NULL に設定すると、入力ファイルとして扱われなくなります。名前 – は、標準入力を示します。引数が assignment オペランドのフォーマットと一致すると、その引数は file 引数ではなく割り当てとして扱われます。
数字を文字列に変換するための printf フォーマット (OFMT が使用される出力文は除く) 。デフォルトは %.6g です。
変数 ENVIRON は、環境値を表す配列です。 配列のインデックスは環境変数の名前からなる文字列で、各配列要素の値はその変数の値からなる文字列です。 環境変数の値が数値列 と考えられる場合、配列要素も数値をとります。
nawk の動作が環境変数の影響を受ける (nawk が system 関数または print 文、printf 文、または getline 関数を使ってパイプライン経由で実行する コマンドの環境も含む) 場合はいずれも、nawk の実行開始時点の環境が使われます。
現在の入力ファイルのパス名。 BEGIN アクション内では、この値は未定義です。 END アクション内では、この値は最後に処理された入力ファイルの名前です。
現在のファイル内の現在のレコードの序数。 BEGIN アクション内では、この値はゼロです。 END アクション内では、この値は最後に処理されたファイル内の 最後に処理されたレコードの番号です。
入力フィールド区切り文字の正規表現。デフォルトは空白文字です。
現在のレコード内のフィールド数。 BEGIN アクション内では、var 引数のない getline 関数がその前に実行されていない限り、NF の使用は未定義です。 END アクション内では、END アクションに入る前に後続の出入力先を変更された var 引数のない getline 関数が実行されていない限り、NF は最後に読み取られたレコードの値を維持します。
入力の開始からの現在のレコードの序数。 BEGIN アクション内では、この値はゼロです。 END アクション内では、この値は最後に処理されたレコードの番号です。
出力文 "%.6g" 内でデフォルトとして、数字から文字列へ変換する際の printf フォーマット。 OFMT の値が浮動小数点フォーマットでない場合、変換の結果は不定です。
print 文出力フィールド区切り文字。 デフォルトは空白文字です。
print 出力レコード区切り文字。デフォルトは復帰改行文字です。
match 関数が照合する文字列の長さ。
RS の文字列値の最初の文字は、入力レコード区切り文字です。 デフォルトは復帰改行文字です。 RS に複数の文字が入っていると、結果は不定です。 RS が NULL の場合、レコードは一連の 1 つ以上の空白行で区切られます。 先行または末尾に空白行があっても、入力の先頭または最後に空のレコードが 作成されることはありません。 FS の値に関係なく、フィールド区切り文字はいつも復帰改行文字です。
match 関数が照合する文字列の開始位置。 1 から順に番号が付いています。これは常に、match 関数の戻り値と等価です。
多次元配列用の添字区切り文字列。 デフォルト値は 1 です。
nawk ユーティリティは、拡張正規表現 (ERE) (regex(5) を参照) を活用しています。ただし ERE 内で特殊文字をエスケープするときは、C 言語規約が使用できます。 \\ 、 \a 、 \b 、 \f 、 \n 、 \r 、 \t 、 \v 、および下の表に示したエスケープシーケンスが使用できます。 これらのエスケープシーケンスは、括弧の内でも外でも認識されます。 なお、レコードは復帰改行文字で区切る必要はなく、文字列定数には復帰改行文字を含めるため、nawk ERE では \n シーケンスも有効です。 正規表現内にスラッシュ文字を使う場合は、下の表に示すように、エスケープを使用しなければなりません。
エスケープシーケンス | 説明 | 意味 |
\" | バックスラッシュ引用符 | 引用符文字 |
\/ | バックスラッシュスラッシュ | スラッシュ文字 |
\ddd | バックスラッシュの後に 1 から 3 桁の 8 進文字 (01234567) の最長シーケンスが続きます。すべての桁が 0 なら (つまり NULL 文字を表しているなら)、動作は未定義です。 | 1 から 3 桁の 8 進整数で文字がエンコーディングされていま す。複数バイト文字には、各バイトごとに先行 \ を含んだ、複数の連結さ れたエスケープシーケンスが必要です。 |
\c | バックスラッシュの後にこの表で説明されていない 文字または特殊文字が続きます (\\, \a, \b, \f, \n, \r, \t, \v)。 | 未定義 |
正規表現照合演算子 ~ または ! ~ のどちらかを使って、正規表現を特定のフィールドや文字列と照合させることができます。 これらの演算子は、オペランドの右側を正規表現、オペランドの左側を文字列と解釈します。 正規表現が文字列と一致すると、~ 式は値 1 と評価され、 ! ~ 式は値 0 と評価されます。正規表現が文字列と一致しない場合、 ~ 式は値 0 と評価され、 ! ~ 式は値 1 と評価されます。右辺のオペランドが字句トークン ERE 以外なら、上で説明したエスケープ規約も含め、式の文字列値は拡張正規表現として解釈されます。 なお文字列リテラル (字句トークン STRING) の値を判断するときも、これと同じエスケープ規約が適用され、この文脈で文字列リテラルが使用されるときもう一度適用されます。
~ または ! ~ 演算子の右辺以外の文脈で ERE トークンが使用されている、または下で説明する組み込み関数の引数の 1 つとして使用されているとき、結果の式の値は、
$0 ~ /ere/
gsub 、 match 、 sub 関数への ere 引数および split 関数への fs 引数 (「文字列関数」の項を参照) は、拡張正規表現として解釈されます。これらは ERE トークンまたは任意の式のどちらでもよく、~ または ! ~ 演算子の右辺と同じ方法で解釈されます。
-F ERE オプションを使うことで、または式を含んだ文字列を組み込み変数 FS に割り当てることで、フィールドの分割に拡張正規表現を使用できます。 FS 変数のデフォルト値は、1 つの空白文字です。 FS の動作を下に説明します。
FS が空白文字なら、先行および末尾の空白文字をスキップします。 フィールドは 1 つ以上の空白文字で区切られます。
FS か a. で説明した空白以外の文字 c なら、フィールドは個々の c によって区切られます。
それ以外の場合、FS の文字列は拡張正規表現と考えられます。 拡張正規表現と一致するシーケンスの発生により、フィールドが区切られます。
gsub 、 match 、 split 、および sub 組み込み関数の場合を除き、正規表現照合は、 入力レコードに基づきます。つまりレコード区切り文字 (変数 RS の値の最初の文字、デフォルトは復帰改行文字) は式に組み込めず、どの式もレコード区切り文字とは一致しません。 レコード区切り文字が復帰改行文字以外なら、式に組み込まれた復帰改行文字を照合させることができます。 この 4 つの組み込み関数では、正規表現照合はテキスト文字列に基づきます。 そのため、どの文字 (復帰改行文字やレコード区切り文字も含む) でも パターンに組み込め、適切なパターンを任意の文字と照合させることができます。 しかしすべての nawk 正規表現照合では、パターン、入力レコード、またはテキスト文字列に NULL 文字を使うと、結果が未定義になります。
パターンは、有効な式、コンマで区切られた 2 つの式で示された範囲、または 2 つの特殊パターン BEGIN と END のいずれかです。
nawk ユーティリティは、2 つの特殊パターン BEGIN と END を認識します。各 BEGIN パターンは一度照合され、最初の入力レコードが読み込まれる前とコマンド行割り当てが行われる前に、対応するアクションが実行されます (以前の BEGIN アクションで getline 関数が使用されたときは例外) 。各 END パターンは一度照合され、最後の入力レコードが読み込まれた後に、対応するアクションが実行されます。この 2 つのパターンにはアクションが対応しています。
BEGIN と END は、その他のパターンとは組み合わせられません。複数の BEGIN および END パターンが使用できます。 BEGIN パターンに対応するアクションは、プログラム内の指定順序で実行されます。これは END パターンの場合も同じです。プログラム内では、END パターンが BEGIN パターンより前でもかまいません。
nawk プログラムが BEGIN パターンのアクションだけで構成されていて、BEGIN アクションが getline 関数を含んでいない場合、最後の BEGIN アクションの最後の文が実行されたとき、nawk は入力を読まずに終了します。 nawk プログラムが END パターンのアクションだけ、または BEGIN パターンと END パターンのアクションだけで構成されている場合、END アクションの文が実行される前に入力が読まれます。
式パターンは、ブール型の文脈の式として評価されます。 結果が真 なら、パターンは一致すると考えられ、対応するアクションがあればそれが 実行されます。結果が偽 なら、アクションは実行されません。
パターンの範囲は、コンマで区切られた 2 つの式から構成されます。この場合、最初の式の一致と 2 番目の式の一致までの間にあるすべてのレコードに対して アクションが実行されます。これにより、入力レコードの先頭から一致した範囲の最後まで、パターンの範囲を繰り返せます。
if ( expression ) statement [ else statement ] while ( expression ) statement do statement while ( expression ) for ( expression ; expression ; expression ) statement for ( var in array ) statement delete array[subscript] # 配列の構成要素を削除 break continue { [ statement ] . . . } expression # 通常変数 = 式 print [ expression-list ] [ >expression ] printf format [ , expression-list ] [ >expression ] next # この入力行にある残りのパターンをスキップ exit [expr] # 入力の残りをスキップ。終了ステータスは expr return [expr]
1 つの文を、かっこで囲まれた文のリストで置き換えることができます。文は、復帰改行文字またはセミコロンで区切られ、指定された順に実行されます。
next 文は、現在の入力レコードの以降の処理をすべて破棄します。 BEGIN または END アクション内で next 文が現れたり呼び出されたりすると、動作は未定義です。
exit 文は、プログラムソース内の順序ですべての END アクションを呼び出した後、以降の入力は読まずにプログラムを終了させます。 END アクション内の exit 文は、以降の END アクションを実行せずにプログラムを終了させます。 exit 文内に式が指定されている場合は、その数値が nawk の終了ステータスです。ただしエラーが検出されたり、式を持った exit 文が実行される場合は除きます。
> expression>> expression| expression
すべての場合、expression が評価され、書き出し先の完全パス名として (> または >> のとき) または実行されるコマンド (| のとき) として使用される文字列が生成されます。最初の 2 つの形式を使うと、その名前のファイルが現在オープンされていなければ オープンされ、必要ならファイルが作成されます。 最初の形式を使うと、ファイルは切り捨てられます。 次に出力データがファイルに付加されます。 ファイルがオープンされている限り、同じ文字列値として式が評価される以降の呼び出しは、単に出力をファイルに付加していきます。 同じ文字列として評価される式で close 関数が呼び出されるまで、ファイルはオープンされたままです。
3 番目の形式は、コマンドの入力にパイプされたストリームへ 出力を書き出します。コマンド名として expression の値を持つストリームが現在オープンされていない場合は、ストリームが作成されます。作成されたストリームは、command 引数として expression の値を持ち、mode 引数として w の値を持つ popen(3C) 関数呼び出しで作成されるものと等価です。 ストリームがオープンされている限り、同じ文字列値として式が評価される 以降の呼び出しは、出力を既存のストリームに書き出します。 同じ文字列値として評価される式で close 関数が呼び出されるまで、ストリームはオープンされたままです。 close 関数が呼び出されると、pclose 関数が呼び出されたかのように、ストリームはクローズされます。
これらの出力文は、コンマで区切られた expression のリストをとります。このリストは、文法解釈において非終端記号 expr_list、print_expr_list、print_expr_list_opt によって参照されます。このリストはここでは expression list として参照され、各メンバーは expression argument として参照されます。
print 文は、現在の出力フィールド区切り文字 (上記の変数 OSF を参照) で区切られ、出力レコード区切り文字 (上記の変数 ORS を参照) で終わる、指定された出力ストリームに、各式の引数の値を書き出します。式の引数はすべて文字列とみなされ、必要なら変換されます。ただし、COMVFMT の値の代わりに OFMT の printf フォーマットが使用されます。 空の式リストは、入力レコード全体 ($0) を意味します。
printf 文は、本書でファイルフォーマットの説明に使用している ファイルフォーマット表記と似た表記に基づいて出力します。文字列 format として最初の式引数、arg1 から argn の文字列として後続の式引数で指定されたとおりに、出力されます。 ただし、以下のような例外があります。
format はグラフィック表現ではなく、実際の文字列です。そのため空の文字位置は含めません。format 文字列内の空白文字は、変換の flag 以外の文脈では、通常の文字として扱われ出力されます。
文字セットに 文字が含まれていて、文字が format 文字列に出現した場合は、通常の文字として扱われ出力されます。
バックスラッシュ文字で始まる escape sequences は、通常文字のシーケンスとして扱われ、出力されます。 なおこのようなシーケンスは、リテラル文字列に出現したとき、nawk によって字句が解析されますが、printf 文によっては特に処理されません。
field width または precision は、数字列の代わりに * 文字として指定できます。この場合、式リストの次の引数が取り出され、その数値がフィールド幅または精度とみなされます。
システムは、format 文字列で指定されていない空白文字を d または u 変換からの出力の先頭や末尾には付けません。
システムは、format 文字列で指定されていない先行ゼロを o 変換からの出力には付けません。
c 変換の場合、引数が数値なら、エンコーディングとして その値を持つ文字が出力されます。 値がゼロのとき、または文字セットのどの文字にもエンコーディングされていないとき、動作は未定義です。引数が数値を持たない場合、文字列値の最初の文字が出力されます。 文字列に文字が含まれていない場合、動作は未定義です。
引数が必要な変換のそれぞれについて、次の式引数が評価されます。 c 変換以外は、変換仕様に応じて値が適切な型に変換されます。
format 文字列内のすべての変換仕様を満たすだけの十分な式引数がない場合、動作は未定義です。
format 文字列内の文字シーケンスが % 文字で始まるが、有効な変換仕様を形成していない場合、動作は未定義です。
print と printf はどちらも、少なくとも {LINE_MAX} バイトを出力できます。
nawk 言語は、算術関数、文字列関数、入出力関数、および一般関数など、豊富な組み込み関数を備えています。
int の場合を除き、算術関数は ISO C 規格に基づいています。エラーを戻すまたは動作が未定義だと ISO C 規格が指定している場合、動作は未定義です。 文法では引数なしまたは括弧なしの組み込み関数を認めていますが、以下のリストで引数や括弧が省略可能 (大括弧 [ ] で表示) と示されていない限り、省略した場合の結果は未定義です。
y/x の逆正接値を返します。
x の余弦値を返します。 x の余弦をラジアン単位で 返します。
x の正弦値を返します。 x の正弦をラジアン単位で 返します。
x の指数関数を返します。
x の自然対数を返します。
x の平方根を返します。
引数を整数に切り捨てます。 x > 0 のときは、0 に向かう方向で整数化します。
0 ≤ n < 1 の範囲の乱数 n を返します。
rand のシード値を expr に設定します。 expr が省略された場合は、時刻を使用します。 以前のシード値が返されます。
以下のリストの文字列関数がサポートされています。 文法では引数なしまたは括弧なしの組み込み関数を認めていますが、以下のリストで引数や括弧が省略可能 (大括弧 [ ] で表示) と示されていない限り、省略した場合の結果は未定義です。
後述の sub 関数と同様の機能ですが、相違点は (ed ユーティリティにおける一括置換のように) 指定されたときに、$0 または in 引数内の正規表現のすべてを置換することです。
文字列 s の中で文字列 t が最初に出現する位置 (最初の文字を 1 として文字数を数えたもの) を返します。 出現しない場合はゼロを返します。
引数を文字列と解釈し、その長さ (文字数) を返します。 引数が指定されていなければレコード $0 全体の長さを返します。
文字列 s の中で正規表現 ere が最初に出現する位置 (最初の文字を 1 として文字数を数えたもの) を返します。出現しなければ 0 を返します。 RSTART は開始位置 (返される値と同じ) に設定され、一致しない場合はゼロに設定されます。 RLENGTH は一致した文字列の長さに設定され、一致しない場合は –1 に設定されます。
文字列 s を a[1] 、 a[2] 、 ... 、 a[n] の配列要素に分割し、値 n を返します。この分割は、正規表現 fs によって行われ、fs が指定されていない場合は、フィールド区切り文字 FS によって行われます。各配列要素は、作成されたときに文字列値を持ちます。 配列要素に割り当てられた文字列が、現在のロケールの小数点文字がピリオドに変更されていて、数値列とみなされる場合は、配列要素もその数値列 の数値を持つことになります。 fs の値が NULL 文字列のとき、結果は未定義です。
fmt で指定した printf フォーマットに従って式をフォーマットし、その結果得られた文字列を返します。
文字列 in の中で正規表現 ERE が最初に出現する位置を探し、その正規表現を文字列 repl に置き換え、置換した総数を返します。 repl 内に出現するアンパサンド (&) は、正規表現に一致する in 内の文字列で置換されます。文字列 repl の最初から最後までに出現するバックスラッシュ (\) が存在する場合、\ の次の文字は文字そのものとみなされ、特別な意味は失われます (たとえば \& は文字どおり & と解釈されます) 。 & と \ 以外は、各文字がどのような特別な意味を持つかは不定です。 in が指定され、lvalue 以外のとき、動作は未定義です。 in を省略すると、nawk は現在のレコード ($0) 内で置換を行います。
文字列 s 内の m 文字目から始まる n 文字の長さの部分文字列を返します。 n がない場合、部分文字列の長さは、文字列 s の長さによって限定されます。
文字列 s に基づいて文字列を返します。現在のロケールの LC_TYPE カテゴリによって tolower マッピングを持つように指定されている s 内の各大文字が、マッピングで指定されている小文字で置換されます。 s 内のその他の文字は変更されません。
文字列 s に基づいて文字列を返します。現在のロケールの LC_TYPE カテゴリによって toupper マッピングを持つように指定されている s 内の各小文字が、マッピングで指定されている大文字で置換されます。 s 内のその他の文字は変更されません。
以上の関数はすべて、パラメータとして正規表現 ERE をとります。ただし、以下に定義されている正規表現であるパターン または文字列値を持つ式は除きます。
入出力関数と一般関数は次のとおりです。
print または printf 文でオープンされた、または同じ文字列値を持つ expression での getline 呼び出しでオープンされたファイルやパイプをクローズします。 クローズが成功すると、この関数はゼロを返します。 それ以外の場合は、ゼロ以外の値を返します。
コマンドの出力からパイプされたストリームから、入力レコードを読み込みます。 コマンド名として expression の値でストリームが現在オープンされていない場合は、ストリームが作成されます。このストリームは、command 引数として expression の値と、mode 引数として r の値を指定して popen 関数呼び出しで作成されるものと同じです。 ストリームがオープンされている限り、expression が同じ文字列値に評価される以降の呼び出しは、ファイルから後続のレコードを読み込みます。 同じ文字列値として評価される式で close 関数が呼び出されるまで、ストリームはオープンされたままです。 close 関数が呼び出されると、pclose 関数が呼び出されたかのように、ストリームがクローズされます。 var がない場合は、$0 と NF が設定されます。それ以外の場合は var が設定されます。
| の左側に (getline を含む式の先頭までに) 括弧で囲まれていない演算子 (連結演算も含む) があるとき、getline 演算子による式の評価は、あいまいになる可能性があります。 $ 演算子の文脈では、| は $ よりも優先度が低いかのようにふるまいます。 その他の演算子を評価した結果は不定であり、移植性のあるアプリケーションは、このような表記をすべて正しく括弧で囲まなければなりません。
$0 に、現在の入力ファイルの次の入力レコードを設定します。 getline のこの形式は、NF、 NR、および FNR 変数を設定します。
変数 var に、現在の入力ファイルの次の入力レコードを設定します。getline のこの形式は、FNR 変数と NRR 変数を設定します。
指定されたファイルから次の入力レコードを読みます。 expression が評価され、完全パス名として使用される文字列を生成します。 その名前のファイルが現在オープンされていない場合は、オープンします。ストリームがオープンされている限り、expression が同じ文字列値に評価される以降の呼び出しは、ファイルから後続のレコードを読み込みます。 同じ文字列値として評価される式で close 関数が呼び出されるまで、ファイルはオープンされたままです。 var がない場合は、$0 と NF が設定されます。それ以外の場合は、var が設定されます。
< の右側に (getline を含む式の最後までに) 括弧で囲まれていない 2 項演算子 (連結演算も含む) があるとき、getline 演算子による式の評価はあいまいになる可能性があります。 このような構文を評価した結果は不定であり、移植性のあるアプリケーションはこのような表記を すべて正しく括弧で囲まなければなりません。
expression で指定されているコマンドを、system(3C) 関数と等価な方法で実行し、コマンドの終了ステータスを返します。
getline 関数は、どの形式で実行した場合でも、正常終了時には 1 を、ファイルの終わりに達すると 0 を、エラー発生時には –1 を返します。
ファイルやパイプラインの名前として文字列が使用されている場所では、文字列のテキストはまったく同じでなければなりません。 「同じ文字列値」とは、「等価文字列」を意味し、空白文字が違うだけでも異なるファイルを表現することになります。
function name(args, . . .) { statements }
関数は、nawk プログラム内のどこからでも参照できます。 さらに、定義より前に使用できます。関数の有効範囲はグローバルです。
関数の引数は、スカラーまたは配列です。 スカラーを使用する関数に引数として配列名が渡されたとき、または配列を使用する関数に引数としてスカラー式が渡されたとき、その動作は未定義です。 関数の引数は、スカラーの場合は値によって、配列名の場合は参照によって引き渡されます。 引数名は関数に対してローカル、その他の変数名はすべてグローバルです。 引数名と関数名または特殊 nawk 変数名とに、同じ名前は使用されません。 グローバルな有効範囲を持つ変数名と関数名に、同じ名前を使用してはなりません。 同じ有効範囲内では、スカラー値と配列に同じ名前を使用してはなりません。
関数定義内のパラメータ数は、関数呼び出しのときのパラメータ数と一致する必要はありません。 ローカル変数としては、余分な仮パラメータを使用できます。 関数定義内の引数より少数の引数が関数呼び出しに指定された場合、関数本体でスカラーとして使用されている余分なパラメータは、NULL 文字列の文字列値とゼロの数値で初期設定されます。また、関数本体で配列として使用されている余分なパラメータは、空の配列として初期設定されます。 関数定義内の引数より多数の引数が関数呼び出しに指定された場合、動作は未定義です。
関数を呼び出すとき、関数名と左括弧の間に空白は置くことはできません。 関数呼び出しは、ネストすることができます。 再帰呼び出しも可能です。 ネストまたは再帰関数呼び出しから戻っても、参照によって引き渡された配列パラメータ以外、呼び出し側関数のパラメータのどの値も変わりません。 return 文は値を戻すために使用できます。関数定義の外に return 文が出現した場合、動作は未定義です。
関数定義において、左括弧より前および右括弧より後の復帰改行文字は 任意指定です。関数定義は、pattern-action の対が許可されている場所ならプログラム内のどこに置いてもかまいません。
index 、 length 、 match 、および substr 関数と、 ISO C 規格の同様の関数とを混同しないでください。 nawk バージョンは文字を扱い、 ISO C 規格はバイトを扱います。
連結は明示的な演算子ではなく隣接する式によって表現されるので、評価の正しい優先順位を示すため、括弧を使用しなければならないことがよくあります。
ファイルが 2 ギガバイト (231 バイト) 以上ある場合の nawk の動作については、largefile(5) を参照してください。
sh を使うアプリケーションの場合、コマンド行に指定する nawk プログラムは、単一引用符内に指定する (たとえば 'program') がもっとも簡単な方法です。 nawk プログラムは一般に、二重引用符をはじめ、シェルに対して特殊な意味を持つ文字を含んでいることが多いためです。 nawk プログラムが単一引用符文字を含んでいる場合、プログラムのほとんどを単一引用符内の文字列として指定し、引用符で囲んだ単一引用符文字とシェルを連結するのが、一般にもっとも簡単な方法です。次の例を見てください。
awk '/'\''/ { print "quote:", $0 }'
これは標準入力からの単一引用符文字を含むすべての行に quote: という接頭語を付けて印字します。
以下に、簡単な nawk プログラムの例を示します。
$3 > 5 |
(NR % 10) == 0 |
/(G|D)(2[0-9][[:alpha:]]*)/ |
この例では、文字クラス digit と alpha を使って、言語独自の数字および文字を照合させています。
/(G|D)([[:digit:][:alpha:]]*)/ |
$2 ~ /xyz/ && $4 !~ /xyz/ |
$2 ~ /\\/ |
ここではバックスラッシュによるエスケープを 2 度解釈しています。 1 度は文字列の字句処理時、もう 1 度は正規表現の処理時です。
$2 ~ "\\\\" |
{OFS=":";print $(NF-1), $NF} |
行番号、コロン、フィールド数の 3 つの文字列は連結され、1 つの文字列として標準出力に書き出されます。
{print NR ":" NF} |
{length($0) > 72} |
{ print $2, $1 } |
BEGIN { FS = ",[\t]*|[\t]+" } { print $2, $1 } |
{s += $1 } END {print "sum is ", s, " average is", s/NR} |
{ for (i = NF; i > 0; --i) print $i } |
/start/, /stop/ |
$1 != prev { print; prev = $1 } |
BEGIN { for (i = 1; i < ARGC; ++i) printf "%s%s", ARGV[i], i==ARGC-1?"\n":"" } |
BEGIN { n = split (ENVIRON["PATH"], path, ":") for (i = 1; i <= n; ++i) print path[i] } |
いま input という名前のファイルがあり、以下のような形式のページヘッダーを含んでいるとします。
Page#
また、program という名前のファイルの内容は次のとおりとします。
/Page/{ $2 = n++; } { print }
ここで次に示すコマンドを実行します。
nawk -f program n=5 input |
これにより input ファイルの内容が、ページ番号 5 を開始ページとして出力されます。
nawk の実行に影響を与える環境変数 LC_COLLATE 、 LC_CTYPE 、 LC_MESSAGES 、 NLSPATH についての詳細は、 environ(5) を参照してください。
数値入力の解釈、数値と文字列との変換、数値出力のフォーマットに用いる、小数点文字を決定します。awk プログラム (コマンド行引数で指定される代入も含む) の処理で認識される小数点文字は、ロケールに関係なくピリオド (POSIX ロケールの小数点文字) です。
次の属性については attributes(5) のマニュアルページを参照してください。
awk(1), ed(1), egrep(1), grep(1), lex(1), sed(1), popen(3C), printf(3C), system(3C), attributes(5), environ(5), largefile(5), regex(5), XPG4(5)
Aho, A. V., B. W. Kernighan, and P. J. Weinberger, The AWK Programming Language, Addison-Wesley, 1988.
file オペランドが指定され、指定されたファイルがアクセスできない場合、nawk は標準エラーに診断メッセージを書き出した後、動作を停止します。
program オペランドまたは progfile オペランドのどちらかで指定されているプログラムが、有効な nawk プログラム (機能拡張説明で指定されている) でないとき、動作は未定義です。
nawk は awk の新しいバージョンで、以前のバージョンにはない機能を備えています。次の大きなリリースにおいて、nawk が awk のデフォルトのバージョンとなる予定です。
フィールドを使用した場合、入力中の空白は 出力上には含まれなくなります。
数値と文字列との間で明示的な変換を行う機能はありません。式を数値として扱うには 0 を加算してください。 また文字列として扱うには、NULL 文字列 ("") を連結してください。
名前 | 形式 | 機能説明 | オプション | オペランド | 入力ファイル | 拡張機能説明 | 使用法 | 使用例 | 環境 | 終了ステータス | 属性 | 関連項目 | 診断 | 注意事項