awk で CGI

会社用からですが、CSV を HTML にする方法ですが、多分、「FS とか OFS とかは以下のように使うんだ」と海外の awker は言うんだろうと思います。(Ed とか Gnomon とか)

$ gawk -F',' -v OFS='</td><td>' '$1=$1;$0="<tr><td>"$0"</td></tr>"' test.csv

まず、FS, OFS をセットするまでは良いとして、$0 の代入だけを行っていますが、代入が成立すれば (awk は破壊的に代入できますから、代入が成立して通常は真になります)、$0 が置き換わります。また、同時に print $0 を行います。ただし、各フィールドは '$1=$1' のようなことをしないとフィールドの再構成が行われないので、'$1=$1' を付けています。 こういうのは awk らしいというのかどうか分かりませんが、よく使われているようです。

それはさておき、awk でも CGI を使うことはできます。 もちろん、GET も POST も可能です。

  • POST は標準入力で与えられますので、awk は何の苦労もなく処理することができます。
  • GET は環境変数 QUERY_STRING で与えられます。

ですから、awk でも処理を行うことが可能です。 確かに Perl のように CGI 用のライブラリがあるわけではないので、Perl ほど簡単ではありません。

ここの Blis という CMS (?) でも CGI として awk が使われています。

簡単な例を示します。 まず、以下のような HTML フォームを用意します。

<html>
    <head>
        <title>CGI テスト</title>
    <head>
    <body>
        <form method="POST" action="post.cgi">
            <input type="text" value="Post" name="post_1">
            <input type="text" value="ポスト" name="post_2">
            <input type="submit" value="post" name="submit">
        </form>
        <hr>
            <form method="GET" action="get.cgi">
            <input type="text" value="Get" name="get_1">
            <input type="text" value="ゲット" name="get_2">
            <input type="submit" value="get" name="submit">
        </form>
    </body>
</html>

まず、POST の場合には、標準入力から受け取ることができますから、以下のように書けます。

#! /bin/gawk -f
# post.cgi

{
    query_string = $0;
}

END {
    print "Context-Type: text/text";
    print "\r";

    split(query_string, arr_query, "&");
    for (i in arr_query) {
        split(arr_query[i], arr_query_val, "=");
        query_name        = arr_query_val[1];
        query_str         = arr_query_val[2];
        query[query_name] = query_str;
    }

    # クエリの一覧
    for (i in query) {
        print i " = " query[i];
    }
}

同様にして GET の場合には、環境変数から受け取りますので、以下のように書けます。

#! /bin/gawk -f
# get.cgi

BEGIN {
    ORS = "\r\n";

    # 環境変数 QUERY_STRING からの読み出し
    split(ENVIRON["QUERY_STRING"], arr_query, "&");
    for (i in arr_query) {
        split(arr_query[i], arr_query_val, "=");
        query_name        = arr_query_val[1];
        query_str         = arr_query_val[2];
        query[query_name] = query_str;
    }

    print "Context-Type: text/text";
    print "";

    # クエリの一覧
    for (i in query) {
        print i " = " query[i];
    }
}

awk の場合、エンコードの問題を解決するには nkf コマンドなどの力を借りる必要がありますが、Unix 系 OS の場合にはひとつの言語で完結させることにこだわる必要もないでしょう。

実際にこれを動かしてみました。

これを機会に awk の CGI がもっと普及することを願います。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png