AWK

出典: フリー百科事典『ウィキペディア(Wikipedia)』
Awkから転送)
移動: 案内, 検索

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

目次

[編集] 概要

AWK は、ベル研究所における UNIX開発の過程で、sedgrep のようなテキスト処理ツールに演算機能を持たせた拡張ツールとして開発された。

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

名称の AWK は、開発者であるアルフレッド・エイホ(Alfred Aho)、ペーター・ワインバーガ(Peter Weinberger)、ブライアン・カーニハン(Brian Kernighan)の3人の頭文字を取って付けられたものであるが、AWK は「オーク」と読み、「エー・ダブリュー・ケー」と読んではならないと著者らはしている[1]。また、全て小文字でawkとしたばあい、UnixないしPlan9における、AWKのインタプリタ処理系プログラム自体(他の多くのコマンドと同じく全て小文字である)を指してそうしていることがある。

[編集] AWKの文法

[編集] 基本構成

AWK のスクリプトは、パターンとアクションの組を並べた形になっている。実行を開始すると、まずBEGINパターンのアクションを実行する。以降、入力を読み込んでは、レコードセパレータ(デフォルトでは行末)までを1レコードとし、フィールドセパレータに従ってフィールドに分割してから、レコードがパターンにマッチするかを調べ、パターンにマッチしたらそのパターンに対応するアクションを実行する。一致するパターンが複数ある時は、該当するアクションが上から順に全て実行される。これを入力が尽きるまで繰り返す。入力が尽きたら、ENDパターンのアクションを実行し、終了する。

プログラムが扱えるデータ型は、数値(全て倍精度浮動小数点型で扱われる)、文字列連想配列である。添字を内部で文字列化してキーとして使うことで、連想配列を通常の配列のようにも使う。

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

BEGIN {
  (開始処理)
}

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

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

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 では、関数を定義して使用することが可能である。

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

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

AWK の変数は、引数を除いて全て広域変数であり、ローカルなスコープを持つのは引数として宣言された変数だけである。このため、テクニックとして、関数定義で余分な引数を宣言し、それをローカル変数として使う、ということがおこなわれる。AWK では、関数の呼び出し時に、実引数の個数が仮引数の個数より少なくても、省略とみなしエラーとしない。これを利用して、余分な引数をローカル変数として使うのである。構文上の区別は無いが、判読性を向上させるために両者の間に十分な空白を挿入するのが慣例になっている。つまり、次のような形である。

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

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

また、AWK の関数は再帰呼び出しもできる。

[編集] 制御構造

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

  • if (式) 文
  • if (式) 文 else 文
  • for (式;式;式) 文
  • for (変数 in 配列) 文
  • while (式) 文
  • do 文 while (式)
  • 他 break および continue

また、制御構造の他に、以下の文がある。

  • 複文 { [ 文 ... ] }
  • 式文 式;
  • print, printf (C言語では入出力は関数である)
  • return
  • next (現在の入力レコードについて、以降のパターンをスキップ)
  • nextfile (現在の入力ファイルの残りをスキップ)
  • delete (連想配列の全部ないし要素を削除)
  • exit (プログラムを終了。これもC言語では関数である)

[編集] AWK の処理系

オリジナルの awk は、UNIX ツール群のなかの一つであったが、様々なプラットフォームに移植された他、現在ではUnix用にもGNU AWK(gawk)をはじめとする他の実装が開発されている。

  • one true awk: エイホ、ワインバーガ、カーニハンによる AWK 。一つの真正の、といった感じで、他と区別する場合はone true awkなどと呼ばれる。日本ではくだけた感じで「元祖」などとも。(BSDでは本家Unixとは別の実装になっているtoolも多いが)FreeBSDの/usr/bin/awkなどはこれである。現在もメンテナンスされている。
  • gawk: GNU プロジェクトによる AWK の実装。GNU/Linuxディストリビューションではawkという名前でもこちらのことが多い。POSIX 1003.2 コマンド言語とユーティリティ規約に定められた言語の定義に適合している。マルチバイト文字への対応やネットワークへの接続機能など、オリジナルの awk には無い多数の拡張が加えられており、現在もバージョンアップが続いている。
    • jgawk: gawk がマルチバイト文字に対応する以前に作られた gawk の日本語文字対応拡張版。
  • mawk: Mike Brennan による AWK の実装。オリジナルの awk に少数の拡張が加えられている。
    • mawk MBCS: 木村浩一(ハンドル名 Bruce.)による mawk のマルチバイト拡張。
  • a2p: AWK スクリプトを Perl スクリプトに変換するトランスレータ。Perl 配布キットに含まれている。

[編集] 参考文献

[編集] 関連項目

[編集] 脚注

  1. ^ たとえばカーニハンによる『プログラミング言語AWK』の日本語版序文に見られる。なお、同著の表紙にはオオウミガラス(GREAT AUK)が描かれており、これもその主張の強調である。
  2. ^ http://w3.shinkigensha.co.jp/books/4-7753-0249-3.html
  3. ^ http://www.fukkan.com/fk/CartSearchDetail?i_no=68313239
  4. ^ http://www.usp-lab.com/pub/book.awk.html
  5. ^ http://www.usp-lab.com/pub/book.awk.html

[編集] 外部リンク

個人用ツール
名前空間

変種
操作
案内
ヘルプ
ツールボックス
他の言語