みんなの願い事がわかる awk スクリプト
今日は七夕です (正確にはスクリプトを組んでいるうちに七夕になってしまいました)。 みんなの願い事が分かる API - IT戦記を見て awk でも似たようなことをやってみようと考えたのでしたが、ブラウザのように派手にはなりませんでした。
xgawk の機能を使って、#tanzaku - Twitter Search から XML を取得、パースして、コンソールにカラフルに表示します。 xgawk の time プラグマを使うと、sleep コマンドと同様の sleep() 関数が使えます。 それ以外は今までに登場したものばかりです。
#! /usr/local/bin/xgawk -f
# tanzaku.awk
# tanzaku@twitter に集まったメッセージを表示する
# usage: xgawk -f tanzaku.awk
@load xml
@load time
BEGIN {
XMLMODE = 0;
tanzaku_url = "http://search.twitter.com/search.atom?q=%23tanzaku";
base_url = gensub(/.*\/\/(.*)\/.*/, "\\1", 1, tanzaku_url);
http_service = "/inet/tcp/0/" base_url "/80";
http_str = "GET " tanzaku_url " HTTP/1.0";
tmp_file = ENVIRON["TMP"] "/tanzaku." PROCINFO["pid"];
nkf_cmd = "/usr/bin/nkf";
nkf_opt = "--numchar-input -w";
nkf_exec = nkf_cmd " " nkf_opt " " tmp_file;
rm_cmd = "/bin/rm";
rm_exec = rm_cmd " " tmp_file;
# /inet での読み込み -> 一旦 tmp_file に書き出す
# tmp_file に書き出した方が楽なことが多いんです
ORS = "\r\n";
print http_str |& http_service;
print "" |& http_service;
while ((http_service |& getline) > 0) {
if ($0 ~ /<\?xml/) {
is_xml = 1;
}
if (is_xml) {
print $0 > tmp_file;
}
}
close(http_service);
close(tmp_file);
# ここから XMLMODE
XMLMODE = 1;
ORS = "\n";
# tmp_file の再読み込み
while ((nkf_exec | getline) > 0) {
if (XMLCHARDATA) {
data = $0;
}
if (XMLENDELEM == "title") {
if (data != "#tanzaku - Twitter Search") {
sub(/#tanzaku/, "", data);
printf("\x1b[%dm%s ", int(rand() * 7) + 30, data);
}
sleep(1);
}
}
close(nkf_exec);
print "";
system(rm_exec);
}

実行結果は、そのまま掲載するのは良くないので、別のサンプルで表示した例を載せておきます。 こんな感じに表示できると思ってください。
色は適当にランダムに選択しているので、あまり美しくありませんが、最近の端末は 256 色に対応しているものも多く存在しますので、もっと綺麗に表示することも可能でしょう。

