AWK

出典: フリー百科事典『ウィキペディア(Wikipedia)』

Awk から転送)

AWKオーク)は、UNIX上で開発されたフィールド指向のテキスト処理スクリプト言語

目次

[編集] 概要

AWK は ベル研究所UNIX開発において、sedgrep のようなテキスト処理ツールに演算機能を持たせた拡張ツールとして開発された。AWK の名前の由来は、このツールの開発者であるアルフレッド・エイホ(Alfred Aho)、ペーター・ワインバーガ(Peter Weinberger)、ブライアン・カーニハン(Brian Kernighan)の3人の頭文字を取って付けられたものである。

本来ならAWK は汎用ツールであり、短いスクリプトを記述することを目的としていたためプログラミング言語と呼ぶほどの機能は無かった。しかし、より大きなプログラムを組みたいというユーザーの希望により機能の拡張が行われたため、その機能は汎用のプログラミング言語のインタプリタと比べてさほど遜色はなくなり、また上記の開発理由によりテキストファイルの検索や編集の容易さにおいては他に並ぶものがなかった。このため開発者の思惑を越えて、テキスト処理に特化したプログラミング言語として普及していった。現在でもCSVTSV形式のファイルを簡易に処理するなどの目的で使用されている。初期は UNIX のツール群の一つであったが現在ではGNU AWK(gawk)をはじめ様々なプラットフォーム用の処理系が開発されている。

AWK のプログラムは、パタンとオペレータの組を並べた形になっている。入力元から1行読み込んで、正規表現で条件指定されたフィールドセパレータに従ってフィールドに分割してから、その行について条件式が真ならブロックの中身を実行する。これを全ての入力行について行うのが基本的な動作である。 データ構造としては、数値、文字列配列連想配列を持つ。

AWK の発音は "オーク" であるが、これは日本語話者にとって不自然であるため、“エー・ダブリュー・ケー”と発音する人がいる。しかし AWK の教典こと『プログラミング言語AWK』の日本語版の序文では制作者の一人であるブライアン・カーニハンは決してそのような発音をしてはならないと主張している記載がある。 なお、この本の表紙に書かれているのはオオウミガラス(GREAT AUK)でありその主張の強調でもある。

[編集] AWKの文法

[編集] 基本構成

AWKの基本構成は次のようになっている

BEGIN {
  (開始処理)
}

(パタン1) {
  (アクション1)
}

(パタン2) {
  (アクション2)
}
 
 ・・・
 
END {
  (終了処理)
}

まずプログラムが実行されるとBEGIN内の処理が実行される。その後、入力元から1行読み込むごとに一致するパタンに対応するアクションを実行する、一致するパタンが複数ある時は上から順に該当するアクションが全て実行される。全てのデータが読み込まれると最後に END 内の処理が実行される。なお開始処理、終了処理が必要ない場合は BEGIN と END 部は省略できる。

例としてテキストファイル内から"AWK"という単語を含む行の数をカウントするプログラムを以下に示す。

BEGIN {
  count = 0
}

/AWK/{
  count ++
}

END {
  print "AWKを含む行の数は ", count, "個"
}

なお、AWKではプログラム開始時に変数は全て初期化されるので実際には上の例での BEGIN 部は必要ない。 パターンには以下のような、開始と終了を定義可能である。

/開始パターン/,/終了パターン/ {
  アクション
}

例:

/Hello/,/Bye/ {
  print $0;    #Helloを含む行から,Byeを含む行までがマッチする。
}

[編集] 変数

AWK の特徴の一つとして変数が型を持たないことが挙げられる。これはMLのように型推論が行われているのではなく、本当に「型」が無いのである。例えば、

a = "1" 

と書いた場合、型推論を持つ言語の場合このときに「aは文字列型である」と認識する、このとき

b =  a + 1

と書くと、aは文字列型であるので通常はエラーである。しかし AWK の場合はこれでも変数 b の中に 2 という数字が代入される。

[編集] 関数

AWKでは関数を定義し使用することが可能である。

function 関数名(引数, ・・・, 引数,         ローカル変数, ローカル変数・・・){
  命令文
}

AWK には正確にはローカル変数は存在しない、ただ関数の実行時に引数を省略できるので余分な引数を書いておくことでその部分をローカル変数の代わりに使用することができるのである。このため AWK の変数は基本的には全て広域変数であるが、関数を定義する際には上記のように記述しローカル変数として使用する事ができる。 引数とローカル変数の文法上の区別は無いが判読性を向上させるために空白を間に挿入するのが慣例になっている。

また、AWK の関数は再帰呼び出しもできる。return文を使用して、戻り値を使用することも可能。

[編集] 制御構文

AWKの構文はC言語を模倣している。

break
continue
do 文 while(式)
exit
exit(式)
if(式) 文
if(式) 文 else 文
for(式;式;式) 文
for(変数 in 配列) 文
next
return
return 式
while(式) 文

[編集] AWK の他の処理系

  • gawk: GNU プロジェクトが開発した AWK の実装。POSIX 1003.2 コマンド言語とユーティリティ規約に定められた言語の定義に適合している。環境変数 LANG や LC_ALL 等を参照しマルチ・バイトに対応している。ネットワークに接続する機能も追加されている。また、文法やコマンド・ライン・オプションに GNU の拡張がある。
  • jgawk: gawk がマルチ・バイトに対応する以前に作られた gawk のマルチ・バイト拡張。コマンド・ライン・オプションにより、EUC-JP、Shift JISUTF-8 をマルチ・バイト文字として認識できる。また、シングル・バイト文字の ASCII も指定できる。
  • mawk: Mike Brennan による AWK の実装。少数の拡張がされている。
  • mawk MBCS: 木村浩一(ハンドルは Bruce.)による mawk のマルチ・バイト拡張。
  • a2p awkスクリプトをPerlスクリプトに変換するトランスレータ。Perl配布キットに含まれている。

[編集] 参考文献

[編集] 関連項目

[編集] 外部リンク