gawk
「gawk」の意味・「gawk」とは
「gawk」は英語の単語であり、日本語に訳すと「ぼんやり見る」「ぽかんと見る」などの意味を持つ。特に、驚きや興味から目を離せない様子や、無作法にじろじろと見つめる様子を表す際に用いられる。例えば、美術館で初めて見る絵画に見入ってしまう様子や、街中で珍しいものを見つけてじっと見つめてしまう状況などに「gawk」という単語が使われる。「gawk」の発音・読み方
「gawk」の発音は、IPA表記では/gɔːk/となる。これをカタカナに置き換えると「ゴーク」となる。また、日本人が発音する際のカタカナ英語としては「ガーク」が近い。この単語は発音によって意味や品詞が変わる単語ではないため、一つの読み方のみを覚えればよい。「gawk」の定義を英語で解説
英語の辞書によると、「gawk」は「to stare openly and stupidly」つまり、「開けっ広げに、愚かに見つめる」と定義されている。この定義からも、「gawk」がどのような状況で使われるかが理解できる。例えば、驚きのあまり口を開けたまま何かを見つめてしまう様子や、興味津々で無作法にじっと見つめてしまう様子などを表す。「gawk」の類語
「gawk」の類語には、「stare」、「gape」、「goggle」などがある。「stare」は「じっと見る」、「gape」は「口を開けて見る」、「goggle」は「目を大きく開けて見る」といった意味で、「gawk」と同じく見つめる様子を表す単語である。「gawk」に関連する用語・表現
「gawk」に関連する表現としては、「gawk at」がある。「gawk at」は「~をぼんやりと見る」、「~をじろじろ見る」といった意味で、「gawk」の後に見つめる対象を置くことで具体的な状況を表現することができる。「gawk」の例文
1. He was gawking at the paintings in the museum.(彼は美術館の絵画をぼんやりと見ていた。)2. Don't gawk at people like that, it's rude.(そんな風に人をじろじろ見ないで、それは無礼だ。)
3. She gawked at the strange creature.(彼女はその奇妙な生き物をじっと見つめた。)
4. The tourists gawked at the tall buildings.(観光客たちは高いビルをぼんやりと見ていた。)
5. I couldn't help but gawk at the beautiful sunset.(美しい夕日を見て、思わず見入ってしまった。)
6. The children were gawking at the candy shop.(子供たちはキャンディショップをじっと見つめていた。)
7. He gawked at the accident scene.(彼は事故現場をぽかんと見ていた。)
8. She gawked at the handsome actor.(彼女はそのハンサムな俳優をじろじろ見ていた。)
9. The crowd gawked at the street performer.(群衆はストリートパフォーマーをじっと見つめていた。)
10. I gawked at the stunning view from the top of the mountain.(山頂からの素晴らしい景色に見入ってしまった。)
AWK
![]() AWKのロゴ | |
![]() | |
登場時期 | |
---|---|
開発者 |
アルフレッド・エイホ ![]() |
最新リリース | IEEE Std 1003.1-2008 / |
影響を受けた言語 |
SNOBOL、Bourne Shell ![]() |
AWK(オーク[1][2][3])は、プログラミング言語の一つ。 テキストファイル、特に空白類(スペースの他、タブなど)やカンマなどで区切られたデータファイルの処理を念頭に置いた仕様となっているが、一般的なプログラミングに用いることも可能である。UNIX上で開発された。
概要
AWKは、ベル研究所におけるUNIX開発の過程で、sedやgrepのようなテキスト処理ツールに演算機能を持たせた拡張ツールとして1977年[4]に開発された。そのため、UNIX上のユーティリティである sort の存在を前提としている[4]。
簡単なスクリプトを記述することで効率的にテキストファイルを処理することが目的であった。 当初はそれほど多くの機能は無かったが、普及するにつれ、さまざまな処理をAWKで実行したいと考えるユーザーが増え、その希望に応えて1985年[4]に機能の拡張が行われた。その結果、汎用のプログラミング言語と比べても遜色が無いほどの機能を持つようになり、テキスト処理だけに留まらず、開発者も予想しなかったような大規模なプログラミングに使われるような例もあらわれた。一方、本来のテキスト処理用ツールとしても扱いやすく、現在でもCSV形式のファイルを簡易に処理する、などの目的で広く使用されている。
「AWK」という名称は、開発者であるアルフレッド・エイホ、ピーター・ワインバーガー、ブライアン・カーニハンの3人の苗字の頭文字を取って付けられたものであるが、AWKは「オーク」と読み、「エー・ダブリュー・ケー」と読んではならないと著者らはしている[注釈 1]。
また、全て小文字でawk
とした場合、Unix系OSないしPlan 9における、AWKのインタプリタ処理系プログラム自体(他の多くのコマンドと同じく全て小文字である)を指してそうしていることがある。
AWKの文法
基本構成
AWKのスクリプトは、パターンとアクションの組を並べた形になっている。
実行を開始すると、まずBEGIN
パターンのアクションを実行する。
以降、入力を読み込んでは、レコード分離文字(既定では改行)までを1レコードとし、ユニット分離文字(既定では連続するスペースまたは水平タブ)に従ってフィールドに分割してから、レコードがパターンにマッチするかを調べ、パターンにマッチしたらそのパターンに対応するアクションを実行する。
一致するパターンが複数ある時は、該当するアクションが上から順に全て実行される。これを入力が尽きるまで繰り返す。入力が尽きたら、END
パターンのアクションを実行し、終了する。すなわち、テキストストリームをシーケンシャルに読み込み、入力されるテキストストリームをレコードセパレータ毎に区切り、1行毎にスクリプトに記述されたアクションを順次実行する。
ファーストクラスのデータ型は、数値(全て倍精度浮動小数点型で扱われる)と文字列である。
他に文字列をキーとした連想配列があるが、連想配列はファーストクラスではなく関数の返戻値にできないなどデータというよりは、配列変数という変種の変数があるといったような扱いである。連想配列の中身(要素)を連想配列にすることはできないため、ループするようなデータ構造を作ることは不可能。連想配列のキーに数値を使うと、文字列に変換したものがキーとなる。
arr[x, y]
のようにして多次元配列のように見えるアクセスもできるが、実際には各次元を必要であればまず文字列化した後に、グローバル変数SUBSEP
の文字列(デフォルトではU+001C <control-001C>)をセパレータとして連結した文字列をキーとしてアクセスする。
スクリプトの基本構成は次のようになる。
BEGIN {
開始時処理
}
パターン1 {
アクション1
}
パターン2 {
アクション2
}
……
# コメント
END {
終了時処理
}
BEGIN
,END
アクションは必須ではない。
例として、テキストファイル内の全ての行のうち、空行の数と「林檎」・「りんご」または「リンゴ」という文字列を含む行の数をそれぞれ出力するAWKプログラムを示す。
BEGIN {
# 行の個数を表わす変数を宣言・初期化
blank_line = 0
bol_apple = 0
}
/^$/ {
++blank_line
}
/(林檎|りんご|リンゴ)/ {
++bol_apple
}
END {
print "空行は" blank_line "行です。"
print "「林檎」・「りんご」または「リンゴ」という文字列を含むのは" bol_apple "行です。"
}
なお、AWKでは、まだ代入されていない変数は暗黙のうちに0
または""
で初期化されると仮定してよいので、上の例でのBEGIN
ブロックは必須ではない。
パターンには以下のように開始と終了を定義するパターンもある。
/開始パターン/,/終了パターン/ {
アクション
}
例えば、以下のようなプログラムは、「<script>」を含む行から「</script>」を含む行まで(その行自身を含む)の間、指定されたアクションが実行する(この場合は単に行全体を出力する)。
/<script>/,/<\/script>/ {
print $0;
}
変数
AWKの特徴の一つとして変数が型を持たないことが挙げられる。変数宣言が不要で、プログラム中で使用される変数は暗黙のうちに初期化される。このため、未定義変数や未初期化変数を参照することによるエラーはAWKには存在しない。
AWKは算術演算のような数値を必要とする文脈では暗黙に値を数値に変換し、逆に文字列を必要とする場合には文字列に変換する。 例えば、
a = "01"
b = 2
d = a + b
e = a + b + c
のような例では、d
およびe
の値は3
になる。
こうした暗黙の変換は便利であると同時に、利用者の意図しない結果を生むこともある。
また、変数に入っているのがどちらかわからないが、必ず数値が必要という場合などにx + 0
のように0を足したり、逆に必ず文字列が必要という場合などにx ""
のように""を結合させたりする、という常套手段がある。
関数
AWKでは、関数を定義して使用することが可能である。
関数の定義は次のようになる。
function 関数名 (引数1, 引数2, ……)
{
命令文1
命令文2
……
}
AWKの変数は、引数を除いて全て大域変数であり、局所のスコープを持つのは引数として宣言された変数だけである。このため、技法として、関数定義で余分な引数を宣言し、それを局所変数として使う、ということが行なわれる。AWKでは、関数の呼び出し時に、実引数の個数が仮引数の個数より少なくても、省略とみなしエラーとしない。これを利用して、余分な引数を局所変数として使うのである。
function 関数名 (引数1, 引数2, 引数3, 局所変数1, 局所変数2, ……)
{
……
}
このように関数を定義した上で,呼び出すときに引数を3つしか使わなければ、局所変数1
以降は局所変数として扱える。構文上の区別は無いが、判読性を向上させるために両者の間に十分な空白を挿入するのが慣例になっている。
function 関数名 (引数1, 引数2, 引数3,
局所変数1, 局所変数2, ……)
{
……
}
また、関数は再帰呼び出しもできる。
制御構造
AWKの制御構造には以下のようなものがある。
- if文
-
if (式) 式が真の時に実行される文
if (式) 式が真の時に実行される文 else 式が偽の時に実行される文
- for/while文
-
for (初期化式; 条件式; 更新式) 実行される文
for (変数 in 配列) 実行される文
while (式) 実行される文
do 実行される文 while (式)
break
continue
- その他
-
next
- 以降の文の実行および以降のパターン処理をせずに、次のレコードの処理を開始する
nextfile
- 現在の入力ファイルの残りを読み込まずに、次のファイルの処理を開始する
return
- 関数の処理を停止し、関数の呼び出し元に制御を戻す。値が指定されてあれば値を返す。
exit
- プログラムの実行を終了させる
また、制御構造の他に、以下の文がある。
{文1; 文2; ……; 文n}
print
printf
delete
連想配列の全部ないし一部の要素を削除
AWKの処理系
もともとのAWKは、UNIXに付属していたものであったが、
様々なプラットフォームに移植された他、GNU AWK(gawk
)を代表に、他の実装も多い。
- 旧版
- 1970年代後半から1980年頃開発されていたもので、V7の頃のUNIXに付属、『UNIXプログラミング環境』(en:The Unix Programming Environment)4.4節での説明で使われている版でもある[5]。関数のユーザー定義ができないのが、現在と比べると大きな制限である。これ、ないし次を指して、日本ではくだけた感じで「元祖」などと呼ぶ。
nawk
- 1980年代後半頃までのバージョンアップにより登場したもので、SVR3の頃のUNIXに付属[5]。旧バージョンと区別してnawk(new awk)とも。関数のユーザー定義などの機能が追加された。一つの真正の、といった感じで、他と区別する場合はone true awkなどとも呼ばれる。(BSDでは本家 UNIX とは別の実装になっているtoolも多いが)FreeBSD(バージョン5およびそれ以降)の
/usr/bin/awk
などはこれである。大きな機能追加などは以前から無いが、現在もメンテナンスされている[6]。 FreeBSD、NetBSD、OpenBSD、macOS、illumos、Android などで使用されている。 gawk
- GNUプロジェクトによるAWKの実装。GNU/Linuxディストリビューションでは
awk
という名前のプログラムがこの実装であることが多い。POSIX 1003.2コマンド言語とユーティリティ規約に定められた言語の定義に適合している。マルチバイト文字への対応やネットワークへの接続機能など、オリジナルのAWKには無い多数の拡張が加えられており、現在もバージョンアップが続いている。
jgawk
gawk
がマルチバイト文字に対応する以前に作られたgawk
の日本語文字対応拡張版。
mawk
- マイク・ブレナン(英: Mike Brennan)作。旧版の
awk
に少数の拡張が加えられている。バイトコードに変換されて実行されるため,高速な動作が期待できる。またgawk
よりもバイナリサイズが小さい。
mawk
MBCS- 木村浩一(ハンドル名:Bruce)による
mawk
のマルチバイト拡張。
- 標準
- AWKは
awk(1)
としてIEEE Std 1003.1-2017で標準化されている[7]。また、Linux Standard Baseでも指定コマンドになっている[8]。
脚注
注釈
出典
- ^ “AWK(オーク)でプログラミング”. Googleブックス. 2024年7月17日閲覧。
- ^ “awk 【Aho Kerninghan Weinberger】”. IT用語辞典. 2024年7月17日閲覧。
- ^ “【 awk 】コマンド(基本編)――テキストの加工とパターン処理を行う”. ITmedia. 2024年7月17日閲覧。
- ^ a b c アルフレッド・エイホ, ブライアン・カーニハン & ペーター・ワインバーガ 1989, pp. x-xi, §序文.
- ^ a b 志村拓, 鷲北賢 & 西村克信 1993, p. 43.
- ^ ソースリポジトリ − https://github.com/onetrueawk/awk
- ^ “awk”. IEEE 及び The Open Group (2013年). 2018年10月14日閲覧。
- ^ “Relevant Commands”. Linux Foundation (2015年). 2018年10月14日閲覧。
参考文献
- プログラミング言語AWK
- アルフレッド・エイホ、ブライアン・カーニハン、ペーター・ワインバーガ 著、足立高徳 訳『プログラミング言語AWK』トッパン、1989年11月。ISBN 4-8101-8008-5。 - 「AWK book」(AWK 本)などと呼ばれ、C言語におけるK&Rのような扱いの本である。日本版は版元の出版事業撤退により最初に絶版となる。
- A・エイホ、B・カーニハン、P・ワインバーガー 著、足立高徳 訳『プログラミング言語AWK』シイエム・シイ出版部、2001年2月。ISBN 4901280406。 - トッパン 1989年刊の再刊。
- A・エイホ、B・カーニハン、P・ワインバーガー 著、足立高徳 訳『プログラミング言語AWK』新紀元社、2004年2月。ISBN 4-7753-0249-3。 - 新紀元社から復刊されたものの、3度目の絶版となる。
- A・エイホ、B・カーニハン、P・ワインバーガー 著、足立高徳 訳『プログラミング言語AWK』ユニバーサル・シェル・プログラミング研究所、2010年1月。ISBN 978-4-904807-00-2。 - ユニバーサル・シェル・プログラミング研究所から3度目の復刊がなされた。
- 志村拓、鷲北賢、西村克信『AWKを256倍使うための本』アスキー、1993年3月。ISBN 4-7561-0162-3。 - アスキーの256本のひとつで、通称「AWK256本」とも呼ばれており、現在も販売中のベストセラーである。
- Dale Dougherty、アーノルド・ロビンス 著、福崎俊博 訳『sed & awk プログラミング 改訂版』オライリー・ジャパン、1997年10月。ISBN 4-900900-58-3。
- Arnold Robbins 著、福崎俊博 訳『sed & awk デスクトップリファレンス』オライリー・ジャパン、2000年7月。ISBN 4-87311-017-3。
関連項目
外部リンク
- Effective AWK Programming - A User's Guide for GNU Awk の日本語訳
- AWK のまとめ — 弘前大学 教育学部 教育実践研究指導センター 小山智史
- aaa - the Amazing Awk Assembler by Henry Spencer(英語)
awk(1)
– Linux User Commands Manual (en)
gawk
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/03/03 14:17 UTC 版)
GNUプロジェクトによるAWKの実装。GNU/Linuxディストリビューションではawkという名前のプログラムがこの実装であることが多い。POSIX 1003.2コマンド言語とユーティリティ規約に定められた言語の定義に適合している。マルチバイト文字への対応やネットワークへの接続機能など、オリジナルのAWKには無い多数の拡張が加えられており、現在もバージョンアップが続いている。
※この「gawk」の解説は、「AWK」の解説の一部です。
「gawk」を含む「AWK」の記事については、「AWK」の概要を参照ください。
- gawkのページへのリンク