!!!AWK - Aho Kerninghan Weinberger - {{category "UNIX Command",nolink}}awkは、UNIX標準のテキスト処理コマンドで利用可能なテキスト処理に向いているインタプリタ型言語の一つです。grepやsedより、強力なパターンマッチ等が行え、計算機能等も持っています。 gawkは、awk の GNU による実装である。 !!!コマンドライン書式 gawk [POSIX or GNU style options] -f progfile [--] file ... gawk [POSIX or GNU style options] [--] 'program' file ... !!オプション :: -f ''program-file'' / --file ''program-file'' ::: awkへの第 1 引数を用いるかわりに、AWKプログラムをファイル program-file から読み込みます。 ::: -f (または --file )オプションは複数回使用することができます。 :: -F ''fs'' / --field-separator ''fs'' ::: 入力フィールドセパレータ (変数 FS の値)を fs とします。 :: -v ''var''=''val'' / --assign ''var''=''val'' ::: プログラムを実行する前に、変数 var に値 val を設定します。 ::: このようにして設定した変数は、AWKプログラムのBEGINブロック内でも参照できます。 :: -mf ''NNN'' , -mr ''NNN'' / ::: さまざまなメモリの制限値を NNN に設定します。 ::: フラグf は最大フィールド数、フラグr は最大レコードサイズを設定します。 ::: この2つのフラグと -m オプションは、Bell Labs バージョンの UNIX awk に由来しています。 ::: しかし、gawk にはこのような制限はありませんので、gawk では本オプションは無視されます。 :: -W traditional , -W compat / --traditional , --compat ::: 互換モードで動作します。互換モードでは、gawk は UNIX awk と等価な動作を行い、GNU 独自拡張は解釈できません。 ::: このオプションの他の形式よりも、--traditional を使用することが好まれます。詳しくは後述の GNU 拡張を参照してください。 :: -W copyleft , -W copyright / --copyleft , --copyright ::: GNU の著作権表示の短いバージョンを標準出力へ書き出し、成功状態で終了します。 :: -W help , -W usage / --help , --usage ::: 短めのオプション一覧を標準出力へ書き出します。 :: -W version / --version ::: 実行されたgawkプログラムのバージョン情報を標準出力へ書き出します。 :: -W source ''program-text'' / --source ''program-text'' ::: program-text をAWKプログラムとして用います。 :: -W re-interval / --re-interval ::: 正規表現のマッチングで インターバル表現 (interval expressions) を有効にします。 :: -W lint / --lint ::: 他のAWKでの処理が疑わしい、あるいは他のAWKとの互換性がない構造がある場合に警告を行います。 :: -W lint-old / --lint-old ::: オリジナルの Unix awk へ移植できない構造に関して警告を行います。 :: -W posix / --posix ::: 互換 モードをオンにし、更に以下の制約が課せられます。 *\x エスケープシーケンスを解釈しません。 *FS が単一の空白に設定された場合、空白とタブのみがフィールドを区切り、改行はフィールドを区切りません。 *キーワード function に対応する別名 func を解釈しません。 *演算子 ^ や ^= のかわりに ** や **= を用いることができません。 *fflush() 関数は利用できません。 :: -W ctype=ASCII --ctype=ASCII :: -W ctype=EUC --ctype=EUC :: -W ctype=SJIS --ctype=SJIS !!!パターン !!BEGIN と END awkには特殊なパターンであるBEGINとENDが用意されています。BEGINは、処理が行われる一番最初に実行されるもので、ENDは、一番最後に実行されるものです。 !!!組み込み変数 :: ARGC ::: コマンドライン引数の個数 (オプション、プログラム指定は含みません)。 :: ARGIND ::: 現在処理中のファイル名が格納されている配列 ARGV のインデックス。 :: ARGV ::: コマンドライン引数の配列。配列は、0から ARGC - 1 までのインデックスを持ちます。ARGV の内容を変更することで、入力に用いるファイル名を変更することができます。 :: CONVFMT ::: 数値の変換フォーマット。デフォルト値は "%.6g" です。 :: ENVIRON ::: 現在の環境変数の値からなる配列。配列は、環境変数名によりインデックスされ、各要素の値はその環境変数の値です。(例えば ENVIRON["HOME"] は /home/arnold となるでしょう)。 :: ERRNO ::: getlineのリダイレクト、getlineによる読み込み、close()関数の実行時のいずれかにシステムエラーが発生した場合、変数ERRNOにはエラーの内容を示した文字列が設定されます。 :: FIELDWIDTHS ::: 空白で区切られたフィールド長のリスト。 :: FILENAME ::: 現在の入力ファイル名。ただし、BEGINブロック内ではFILENAMEは未定義です。コマンドラインで入力ファイルが指定されていなければ、 FILENAME の値は``-''です。 :: FNR ::: 現在の入力ファイルにおける入力レコード番号。 :: FS ::: 入力フィールドセパレータ。デフォルトでは単一の空白です。 :: IGNORECASE ::: すべての正規表現と文字列操作において大文字小文字の区別を制御します。 :: NF ::: 現在の入力レコードのフィールド数。 :: NR ::: 現在までに読み込んだ入力レコード数の合計。 :: OFMT ::: 数字の出力フォーマット。デフォルト値は"%.6g"です。 :: OFS ::: 出力フィールドセパレータ。デフォルトは空白です。 :: ORS ::: 出力レコードセパレータ。デフォルトは改行です。 :: RS ::: 入力レコードセパレータ。デフォルトは改行です。 :: RT ::: レコードターミネータ。 :: RSTART ::: match() によりマッチした最初の文字の位置。0はマッチしなかったことを示します。 :: RLENGTH ::: match() によりマッチした文字列の長さ。-1はマッチしなかったことを示します。 :: SUBSEP ::: 多次元配列を実現する際に用いられる、配列のインデックスを結合する文字。デフォルト値は "\034" です。 !!!組み込み関数 !!入出力 :: close(''file'') ::: ファイル (またはパイプ、下記参照) をクローズします。 :: getline ::: 次のレコードを $0 に読み込みます。 NF, NR, FNR が設定されます。 :: getline < ''file'' ::: ファイル file から次のレコードを $0 に読み込みます。 NF が設定されます。 :: getline var ::: 次のレコードを変数 var に読み込みます。 NR, FNR が設定されます。 :: getline var < ''file'' ::: ファイル file から次のレコードを変数 var に読み込みます。 :: next ::: 現在のレコードに対する処理を終了し、次のレコードを読み込み、AWK プログラムの最初のパターンから処理を開始します。 :: nextfile ::: 現在の入力ファイルに対する処理を終了し、次の入力ファイルからレコードを読み込みます。 ::: FILENAME と ARGIND が更新され、 FNR が 1 にリセットされ、AWK プログラムの最初のパターンから処理が開始されます。入力データの終端に達したときは、もし存在すれば、 END ブロックが実行されます。 :: print ::: 現在のレコードを出力します。出力レコードは ORS 変数の値にて終端されます。 :: print ''expr-list'' ::: 式 expr-list を出力します。各式は OFS の値で区切られます。出力されるレコードの最後には ORS の値が付加されます。 :: print ''expr-list'' > ''file'' ::: 式 expr-list をファイル file に出力します。各式は OFS の値で区切られます。出力されるレコードの最後には ORS の値が付加されます。 :: printf ''fmt'', ''expr-list'' ::: 書式付き出力です。 :: printf ''fmt'', ''expr-list'' > ''file'' ::: ファイル file への書式付き出力です。 :: system(''cmd-line'') ::: コマンド cmd-line を実行し、終了ステータスを返します。 :: fflush([''file'']) ::: オープンされている出力ファイルまたはパイプ file に関連づけられているバッファをフラッシュします。 ::: file を指定しないと標準出力が、file が空文字列の場合、オープンされているすべてのファイルとパイプのバッファをフラッシュします。 !!数値関数 :: atan2(y, x) ::: y/x の逆正接をラジアンで与えます。 :: cos(expr) ::: expr の余弦をラジアンで与えます。 :: exp(expr) ::: 指数関数。 :: int(expr) ::: 整数への切捨て。 :: log(expr) ::: 自然対数。 :: rand() ::: 0 から 1 の間の乱数を与えます。 :: sin(expr) ::: expr の正弦をラジアンで与えます。 :: sqrt(expr) ::: 平方根。 :: srand([expr]) ::: expr の値を乱数生成関数の種として用います。式が指定されなかった場合は、時刻が用いられます。直前の種の値を返します。 !!文字列関数 :: gensub(r, s, h [, t]) ::: 対象文字列 t から正規表現 r のマッチを探します。 h が g または G で開始する文字列の場合、マッチする r をすべて s に置き換えます。そうでない場合、 h は何番目の r のマッチを置き換えるのかを示します。t を指定しなかった場合は $0 が用いられます。 :: gsub(r, s [, t]) ::: 文字列 t 中で正規表現 r にマッチした部分をすべて s に置換します。置換の個数を返します。 t を指定しなかった場合は $0 が用いられます。 :: index(s, t) ::: 文字列 s 中に含まれる文字列 t の位置を返します。 t が含まれていない場合は 0 を返します。 :: length([s]) ::: 文字列 s の長さを返します。 s を指定しなかった場合には $0 の長さを返します。 :: match(s, r) ::: 文字列 s 中で正規表現 r にマッチする位置を返します。マッチしない場合は 0 を返します。 RSTART と RLENGTH の値が設定されます。 :: split(s, a [, r]) ::: 文字列 s を正規表現 r を用いて分割し、配列 a に格納します。フィールド数を返します。 r が省略された場合は FS が用いられます。配列 a の内容は、分割前にクリアされます。 :: sprintf(fmt, expr-list) ::: 書式 fmt に従って exp-list を整形表示し、結果の文字列を返します。 :: sub(r, s [, t]) ::: gsub() と似ていますが、最初にマッチした文字列のみが置換されます。 :: substr(s, i [, n]) ::: 文字列 s の i 文字目から始まる最大 n 文字の部分文字列を返します。 n が省略された場合、 i 文字目以降の部分文字列が返されます。 :: tolower(str) ::: 文字列 str をコピーし、大文字をすべて小文字に変換したものを返します。アルファベットでない文字は変化しません。 :: toupper(str) ::: 文字列 str をコピーし、小文字をすべて大文字に変換したものを返します。アルファベットでない文字は変化しません。 !!時間関数 :: systime() ::: 基準時点からの経過秒数を返します (POSIX システムでは、基準時点は UTC で 1970 年 1 月 1 日 0:00 です)。 :: strftime([format [, timestamp]]) ::: 書式 format に従って timestamp をフォーマットします。timestamp は systime() が返す値と同じ形式でなければなりません。timestamp が省略された場合、現在の日付が使用されます。 !!!Win32移植版 !!gawk win32 (Vector Soft Library) http://www.vector.co.jp/soft/win95/util/se015007.html GNU awk (gawk) Ver. 2.15.4 にマルチバイト対応(Shift-JIS)を行ったもの。UNICODEには未対応。 !!GnuWin32 http://gnuwin32.sourceforge.net/