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