行数に応じて less と cat を切替えてくれるスクリプト

行数に応じてlessとcatを切替えてくれるスクリプト - みずぴー日記にインスパイヤされて awk でも同様のスクリプトを書いてみます。

要するに端末画面の大きさを拾い、その行数よりもファイルの行数が少ない場合には cat (ここでは nkf) を用い、大きい場合には less (ここでは lv) を用いるというものです。 古くから Unix 系 OS を使っているとファイルの文字コードは様々なものが存在するため、nkf や lv といった自動で文字コードを変換してくれるものを用いると便利です。

コードはもう少し面白いコードにしようと思ったのですが、行数に応じてlessとcatを切替えてくれるスクリプト - みずぴー日記の Perl のコードとほぼ同じ内容になっています。

#! /usr/local/bin/nawk -f
# scat.awk
# 行数に応じて cat と less を切り替えてくれるプログラム
# usage: nawk -f scat.awk file

BEGIN {
    # 端末の高さを取得する
    stty_cmd = "/bin/stty";
    stty_opt = "-a";
    stty_exec = stty_cmd " " stty_opt;
    while (stty_exec | getline > 0) {
        if ($4 == "rows") {
            rows = $5;
            sub(/;/, "", rows);
        }
    }
    close(stty_exec);

    # 表示行数よりもファイル行数が多いかどうかの判定
    file = ARGV[1];
    while (getline < file > 0) {
        nr++;
        if (nr > rows) {
            use_less = 1;
            break;
        }
    }
    close(file);

    cat_exec  = "/usr/bin/nkf -w";
    less_exec = "/usr/bin/lv -Ou8 -c";

    if (use_less) {
        system(less_exec " " file);
    } else {
        system(cat_exec " " file);
    }
}

実際に実行したところを Web で表示しても違いが分かりにくいので、コードだけにしておきます。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png