構文
awk [-F fs] [-v var=value ] [program | -f progfile ...] [file ...]
説明
awk は入力された file を走査し、 program または -f progfile でリテラルに指定したパターンのセットと一致するものを捜します。
各パターンごとに file 内の行がパターンと一致すると、そのアクションが実行されます。各行は、各パターンアクション文のパターン部分と照合され、一致したパターンごとに対応するアクションが実行されます。ファイル名 - は標準入力のことです。 var=value という形式の file は、ファイル名ではなく割当てとして処理されます。 -v オプションが使用されない限り、割当ては、ファイル名であればオープンされる時点で評価されます。
入力行は、空白、または正規表現 FS で区切られたフィールドで構成されます。このフィールドは、 $1、 $2、 ....と表されます。 $0 は行全体を参照します。
オプション
awk が認識するパラメータは次のオプションおよび引き数です。
| -F fs | | フィールドを区切る正規表現を指定します。 デフォルトはスペースおよびタブ文字を認識し、先行するスペースおよびタブを廃棄します。 -F オプションを使用すると、先行する入力フィールドセパレータは廃棄されません。 |
| -f progfile | | awk プログラムファイルを指定します。最大 100 個までのプログラムファイルを指定できます。
これらのファイルにおけるパターンアクション文は、ファイルの指定と同じ順序で実行されます。 |
| -v var=value | | BEGIN アクション (もし存在すれば) の実行前に、 var=value の割当てをします。 |
文
パターンアクション文の形式は次のとおりです。
{ action } を省略すると、行を出力します。パターンを省略すると、常に一致します。パターンアクション文は、改行またはセミコロンで区切ります。
アクションは一連の文です。 文は次のいずれかを可能とします。
if(expression) statement [ else statement]
while(expression) statement
for(expression; expression; expression) statement
for(var in array) statement
do statement while(expression)
break
continue
{[statement ...]}
expression # 一般に、 var=expression
print[expression-list] [>expression]
printf format [,expression-list] [> expression]
return [expression]
next # この入力行にある残りのパターンをスキップします。
delete array [expression] # 配列要素を削除します。
exit [expression] # 即座に終了します。ステータスは
expression です。
文は、セミコロン、改行、または右中かっこで終了します。 空の expression-list は $0 を表します。 文字列定数は引用符
("") で囲み、その中では通常の C エスケープが認識されます。
式は適宜、文字列または数値となり、次の演算子 +、 -、 *、 /、 %、 ^ (指数化) および連結 (空白で示されます) で構築されます。
次の演算子 ++、 --、 +=、 -=、 *=、 /=、 %=、 ^=、 **=、 >、 >=、 <、 <=、 ==、 !=、 "" (二重引用符、文字列変換演算子)、
および ?: も式に利用できます。 変数は、スカラー、配列要素 ( x[i] と表される)、フィールドが使えます。 変数はヌル文字列に初期化されます。
配列添え字は任意の文字列にすることができ、数値でなくてもかまいません (これにより、結合メモリーの形式が考慮されます)。 [i, j,k] などの複数の添え字も可能です。 構成要素は連結され、 SUBSEP の値で区切られます。
print 文は、その引き数を標準出力に (あるいは、 >file または >>file が存在する場合にはファイルに、もしくは |cmd が存在する場合にはパイプに) 出力します。その際、現在の出力フィールドセパレータで区切り、出力レコードセパレータで終了します。 file および cmd は、リテラル名、またはかっこで囲まれた式です。 異なる文の中の同じ文字列値は同じオープンファイルを表します。 printf 文は、フォーマットに従ってその式リストをフォーマットします ( printf(3) を参照)。
組込み関数
組込み関数 close(expr) は、 print または printf 文でオープンされた
ファイルまたはパイプ expr 、または同じ文字列値 expr を指定した getline への呼び出し
をクローズします。 この関数は、正常終了するとゼロを返し、異常終了すると非ゼロを返します。
常用関数 exp、 log、 sqrt、 sin、 cos、 atan2 も組み込まれています。
他の組込み関数は次のとおりです。
| blength[([s])] | | 指定された引き数を文字列とみなし、長さを返します (バイト数)。 引き数がなければ、 $0 の長さを返します。 |
| length[([s])] | | 指定された引き数を文字列とみなし、長さを返します (文字数)。
引き数がなければ、 $0 の長さを返します。 |
| rand() | | 0 から 1 の間の乱数を返します。 |
| srand([expr]) | | rand のシード値を設定し、以前のシード値を返します。 引き数が与えられなければ、日時が初期値として使用されます。これ以外の場合は、 expr が使用されます。 |
| int(x) | | 整数値に切り捨てます。 |
| substr(s, m[ , n] ) |
| | | 文字列 s 中の位置 m (初期値 1) から始る、最大 n -文字の副文字列を返します。 n を省略すると、部分文字列は、文字列 s の長さによって制限します。 |
| index(s, t) | | 文字列 s 中で、文字列 t が最初に出現する位置を、1 から始る文字数で返します。
まったく出現しない場合は、0 を返します。 |
| match(s, ere) | | 文字列 s 中で、拡張正規表現 ere が出現する位置を、1 から始る文字数で返します。 出現しない場合は、0 を返します。
変数 RSTART および RLENGTH は、一致した文字列の位置と長さに設定されます。 |
| split(s, a[, fs]) |
| | | 文字列 s を配列要素 a[1] 、 a[2] 、 ...、 a[n] に分け、 n を返します。 区切りは正規表現 fs または fs が与えられなければ、フィールドセパレータ FS で行われます。 |
| sub(ere, repl [ , in]) |
| | | 文字列 in 中で拡張正規表現 ere に一致する最初のものを repl に置き換えます。 in を与えなければ、 $0 を使用します。 |
| gsub | | sub と同じですが、正規表現で検出された場合、すべて置き換えられます。 sub および gsub は置換え数を返します。 |
| sprintf(fmt, expr, ...) |
| | | printf(3S) フォーマット fmt に従って expr ... をフォーマットした結果の文字列 |
| system(cmd) | | cmd を実行し、その終了ステータスを返します。 |
| toupper(s) | | 引き数文字列 s を大文字に変換し、結果を返します。 |
| tolower(s) | | 引き数文字列 s を小文字に変換し、結果を返します。 |
組込み関数 getline は、現在の入力ファイルからレコードを入力し $0 に設定します。 getline < file は file からレコードを入力し $0 に設定します。 getline x は、レコードを入力し変数 x に設定します。 cmd | getline は cmd の出力を getline にパイプで渡します。 getline は呼び出されるたびに、 cmd から出力された行を戻します。すべての場合において、 getline は、正常な入力については 1 を、ファイルの終わりについては 0、エラーについては
-1 を返します。
パターン
パターンは、( ! || && による) 正規表現と関係式の任意の論理的組み合わせです。 awk は、 regexp(5) の説明に従って拡張正規表現をサポートします。
パターンにおける離れた正規表現は、行全体に適用されます。 正規表現は、演算子 ~ および !~ を使って関係式で使用できます。 /re/ は定数正規表現です。 パターンにおける離れた正規表現の位置を除いて、任意の文字列 (定数または変数) を正規表現として使用できます。
パターンは、2 つのパターンをコンマで区切ったものでも構成できます。
この場合、アクションは最初のパターンから第 2 のパターンまですべての行に対して行われます。
関係式は次のうちのいずれかです。
expression matchop regular-expression
expression relop expression
expression in array-name
(expr,expr,...) in array-name
ただし、relop は、C の 6 つの関係演算子のいずれかであり、matchop は、 ~ (一致する) または !~ (一致しない) のいずれかです。
条件文は、算術式、関係式、またはこの 2 つの論理的組み合わせです。
特殊パターン BEGIN および END を使用すると、最初の入力行が読み取られる前か、最後の入力行が読み取られた後に処理を制御できます。 BEGIN および END は他のパターンと組み合わせることはできません。
特殊文字
正規表現および文字列の両方において次の特殊エスケープシーケンスが、 awk によって認識できます。
| エスケープ | | 意味 | \a | | 警報文字 | | \b | | バックスペース文字 | | \f | | フォームフィード文字 | | \n | | 改行文字 | | \r | | キャリッジリターン文字 | | \t | | タブ文字 | | \v | | 垂直タブ文字 | | \nnn | | 1〜3 桁の 8 進値 nnn | | \xhhh | | 1〜n 桁の 16 進数 |
|
変数名
特殊な意味のある変数名は次のとおりです。
| FS | | -Ffs 入力フィールドセパレータの正規表現。 デフォルトはスペース文字です。オプション -Ffs を使って設定することも可能です。 |
| NF | | 現在のレコードにおけるフィールド数 |
| NR | | 現在のレコードの、入力の先頭からの順序数です。 BEGIN アクション内では、この値は 0 です。 END アクション内では、この値は最後に処理されたレコードの番号です。 |
| FNR | | 現在のファイルにおける現在のレコード番号。 BEGIN アクション内では、この値は 0 です。 END アクション内では、この値は、最後に処理されたファイル中の
最後に処理されたレコードの番号です。 |
| FILENAME | | 現在の入力ファイルのパス名。 |
| RS | | 入力レコードセパレータ。デフォルトは改行文字です。 |
| OFS | | print 文の出力フィールドセパレータ。デフォルトはスペース文字です。 |
| ORS | | print 文の出力レコードセパレータ。デフォルトは改行文字です。 |
| OFMT | | 数値の出力フォーマット (デフォルトは %.6g)。 OFMT の値が浮動小数点フォーマット指定でなければ、結果は不定です。 |
| CONVFMT | | 数値の内部変換フォーマット (デフォルトは %.6g)。 CONVFMT の値が浮動小数点フォーマット指定でなければ、結果は不定になります。 CONVFMT についての詳細は、 『「多言語化対応」』 の UNIX95 変数を参照してください。 |
| SUBSEP | | 複数次元配列の添え字のセパレータ文字列。 デフォルト値は" 34"です。 |
| ARGC | | ARGV 配列の要素数。 |
| ARGV | | コマンド行引き数の配列。オプションおよび 0 番目から ARGC-1
番目までの program 引き数は除外されます。 ARGV 中の引き数は、修正または追加が可能です。 ARGC は変更可能です。各入力ファイルが終了すると、 awk は、 ARGV の中で、 ARGC-1
の現在の値を超えない、次の非ヌルの要素を、 次の入力ファイルの名前として取り出します。
したがって、 ARGV の要素をヌルに設定すると、その要素は入力ファイルとして扱われません。
名前 - は標準入力を示します。ある引き数が assignment オペランドのフォーマットに一致する場合、その引き数は file 引き数ではなく代入として扱われます。 |
| ENVIRON | | 環境変数の配列。添え字は名前です。たとえば、環境変数 V=thing ならば、 ENVIRON["V"] は thing を生成します。 |
| RSTART | | match 関数で一致した文字列の先頭位置で、1 から始ります。
これは、 match 関数の戻り値と常に等価です。 |
| RLENGTH | | match 関数で一致した文字列の長さです。 |
関数は、(パターンアクション文の位置で) 次のように定義できます。
function foo(a, b, c) { ...; return x}
パラメータは、スカラーの場合には値によって渡され、配列名の場合には参照によって渡されます。
関数は、再帰的に呼び出すことができます。 パラメータは関数に対してローカルです。その他の変数はすべてグローバルです。
awk コマンドへの引き数として HP-UX コマンド行でパターンアクション文を使用する場合には、シェルから保護するためにパターンアクション文を一重引用符で囲まなければならないことに注意してください。
たとえば、72 文字よりも長い行をプリントするには、スクリプト (-f progfile コマンド形式) で使用するパターンアクション文は次のとおりです。
awk コマンドへの引き数として使用する同じパターンアクション文は、次のように引用符で囲まれます。
多言語化対応
環境変数
| UNIX95 | | このコマンドに対して XPG4 の動作を使用するように指定します。 XPG4
用の変更点には、上記で説明した動作すべての他に、次の動作上の変更があります。 CONVFMT が指定されずに、 UNIX95 が設定されている場合、 %d はデフォルトで、数値の内部変換形式として使われます。
|
| LANG | | 未設定またはヌルのインターナショナル変数に対するデフォルト値を提供します。 LANG が未設定またはヌルの場合は、デフォルト値として"C"( lang(5) を参照) が使用されます。
インターナショナル変数のいずれかの設定が不適当な場合には、 awk は、すべてのインターナショナル変数が
"C"に設定されているものとして動作します。 environ(5) を参照してください。 |
| LC_ALL | | 空でない文字列値に設定されている場合は、 他のすべてのインターナショナル変数の値が無効になり、
この値が適用されます。 |
| LC_CTYPE | | テキストの解釈方法 (シングルバイト文字、マルチバイト文字、またはその両方)、
プリント可能な文字の種別、 および正規表現の中の文字クラス表現に一致する文字を決定します。 |
| LC_NUMERIC | | 数値入力の解釈、数値と文字列値の変換、 および数値出力のフォーマットを行うときに
使用される小数点を決定します。 ロケールとは無関係に、 ピリオド文字 (POSIX ロケールの 10 進小数点文字) が、 awk プログラムの処理 (コマンド行引き数中の代入も含む) 中で、
10 進小数点文字として認識されます。 |
| LC_COLLATE | | 正規表現の中のマルチ文字照合要素、等価クラス、および
範囲に関する動作のロケールを決定します。 |
| LC_MESSAGES | | 標準エラーに書き込まれる診断メッセージおよび標準出力に書き込まれる
情報メッセージの、フォーマットと内容を制御するために使用すべき ロケールを決定します。 |
| NLSPATH | | LC_MESSAGES の処理用のメッセージカタログの位置を決定します。 |
| PATH | | system(cmd), または入力および出力パイプによって実行されるコマンドを検索する
ときの検索パスを決定します。 |
さらに、すべての環境変数は awk 変数 ENVIRON を介して参照することができます。
サポートされるコードセット
シングル/マルチバイトの文字コードセットがサポートされています。
ただし、変数名には ASCII 文字だけを、正規表現には有効な文字だけを入れなければなりません。
診断
awk は、レコード当たり最大 199 個までのフィールド
($1 、 $2 、...、 $199)
をサポートします。
例
次の指定では、72 文字よりも長い行を出力します。
次の指定では、反対の順序で最初の 2 つのフィールドを出力します。
次の指定は上と同じですが、コンマ、タブ、ブランクのいずれかで入力フィールドを区切ったものを反対の順序で出力します。
BEGIN { FS = ",[ \t]*|[ \t]+"}
{ print $2, $1 }
次の指定では、最初のカラムを加算して合計と平均を出力します。
{ s += $1 }"
END { print "sum is", s, " average is", s/NR }
次の指定では、start/stop ペアの間の行をすべて出力します。
次の指定では、 echo コマンドをシミュレートします ( echo(1) を参照)。
BEGIN { # Simulate echo(1)
for (i = 1; i < ARGC; i++) printf "%s ", ARGV[i]
printf "\n"
exit }
著者
awk は AT&T, IBM, OSF, および
HP によって開発されました。
参照
lex(1)、sed(1)
A. V. Aho, B. W. Kernighan, P. J. Weinberger: The AWK Programming Language, Addison-Wesley, 1988 年
標準準拠
awk: SVID2, SVID3, XPG2, XPG3, XPG4, POSIX.2