AWK

AWKの最新ニュースをまとめて検索!

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

目次

[編集] 概要

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

元々 AWK は簡単なスクリプトを記述することで効率的にテキストファイルを処理することを目的として開発された。そのため、当初はそれほど多くの機能は無かったが、AWK が普及するにつれ、さまざまな処理を AWK で実行したいと考えるユーザーが増え、その希望に応えて機能の拡張が行われた。その結果、汎用のプログラミング言語と比べても遜色が無いほどの機能を持つようになり、開発者も予想しなかったような大規模なプログラミングに使われるような例もあらわれた。一方、本来のテキスト処理用ツールとしても扱いやすく、現在でもCSVTSV形式のファイルを簡易に処理するなどの目的で広く使用されている。

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

[編集] AWKの文法

[編集] 基本構成

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

AWK スクリプトの基本構成は次のようになる。

BEGIN {
  (開始処理)
}

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

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

このスクリプトを実行すると、まず、BEGIN ブロックで定義した開始処理が1度だけ実行される。その後、入力元から1行ずつ行を読み込み、読み込んだ行とパターンが一致すれば対応するアクションを実行する、一致するパターンが複数ある時は、該当するアクションが上から順に全て実行される。これを入力元の最後の行まで繰り返した後、最後に END ブロック内の終了処理が1度だけ実行される。なお開始処理、終了処理が必要ない場合は BEGIN と END 部は省略できる。

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

BEGIN {
  count = 0
}

/AWK/ {
  count ++
}

END {
  print "AWK という単語を含む行の数は ", count, " 行です。"
}

なお、AWK では、全ての変数がプログラム開始時に初期化されるので、上の例での BEGIN ブロックは実際には必要ない。

パターンには以下のように開始と終了を定義することも可能である。

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

例えば、以下のように定義すると、"Hello" を含む行から "Bye" を含む行までの全ての行に対して処理が行なわれる。

/Hello/,/Bye/ {
  print $0;
}

[編集] 変数

AWK の特徴の一つとして変数が型を持たないことが挙げられる。変数宣言が不要で、プログラム中で使用される変数は空文字列によって初期化される。このため、未定義変数や未初期化変数を参照することによるエラーはAWKには存在しない。

AWKは算術演算のような数値を必要とする文脈では暗黙に値を数値に変換し、逆に文字列を必要とする場合には文字列に変換する。例えば、

a = "01"
b = 2
c = "a"
d = a + b
e = a + b + c

のような例では、dおよびeの値は3になる。

こうした暗黙の変換は便利であると同時に、ユーザの意図しない結果を生むこともある。式の値を強制的に数値として扱いたい場合に

x + 0

のように0を足したり、逆に文字列として扱いたい場合に

x ""

のように""を結合させたりといったテクニックが、AWKでのプログラミングにおいてはしばしば用いられる。

[編集] 関数

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

関数の定義は次のようになる。

function 関数名(引数, ・・・) {
  命令文
}

なお、 AWK の変数は全て広域変数であり、ローカル変数は存在しない。ただし、スクリプト作成時のテクニックとして、関数を定義するときに余分な引数を書いておく方法がある。AWK では、関数の呼び出し時に引数を省略できるので、余分な引数はローカル変数として扱えるのである。なお、引数とローカル変数の文法上の区別は無いが、判読性を向上させるために両者の間に空白を挿入するのが慣例になっている。つまり、次のような形である。

function 関数名(引数 1, 引数 2, 引数 3,     引数 4, 引数 5, ・・・) {
  命令文
}

このように関数を定義して、この関数を呼び出すときに引数を3つしか使わなければ、引数 4 以降はローカル変数として扱える。

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

[編集] 制御構文

AWK の制御構文は、C言語に由来しており、以下のようなものがある。

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

[編集] AWK の処理系

オリジナルの awk は、UNIX ツール群のなかの一つであったが、現在ではGNU AWK(gawk)をはじめ様々なプラットフォーム用の処理系が開発されている。

gawk
GNU プロジェクトによる AWK の実装。POSIX 1003.2 コマンド言語とユーティリティ規約に定められた言語の定義に適合している。マルチバイト文字への対応やネットワークへの接続機能など、オリジナルの awk には無い多数の拡張が加えられている。
jgawk
gawk がマルチバイト文字に対応する以前に作られた gawk のマルチバイト拡張。コマンドラインオプションでの指定により、EUC-JPShift JISUTF-8 の処理が可能。
mawk
Mike Brennan による AWK の実装。オリジナルの awk に少数の拡張が加えられている。
mawk MBCS
木村浩一(ハンドル名 Bruce.)による mawk のマルチバイト拡張。
a2p
AWK スクリプトを Perl スクリプトに変換するトランスレータ。Perl 配布キットに含まれている。

[編集] 参考文献

現在絶版新紀元社から再刊(2004年、ISBN 4-7753-0249-3)されたが、これも絶版となっている。

[編集] 関連項目

[編集] 外部リンク

最終更新 2009年11月23日 (月) 16:37 (日時は個人設定で未設定ならばUTC)。
【AWK】変更履歴

ご利用上の注意

もっと調べる!