n 文字のコマンドを見つける

2文字のコマンドを探そう - みずぴー日記 にインスパイヤされて、n 文字のコマンドを見つけてみます。

awk 自身にファイル名の取得をするようなものは実装されていませんので、ここでは ls コマンドと共に使います。

#! /usr/local/bin/nawk -f
# n_command.awk
# n 文字のコマンドを探す
# usage: nawk -f n_command.awk num

BEGIN {
    num = ARGV[1];
    num_path = split(ENVIRON["PATH"], arr_path, /:/);

    ls_cmd = "/bin/ls";
    ls_opt = "-1";

    for (i = 1; i <= num_path; i++) {
        ls_exe = ls_cmd " " ls_opt " " arr_path[i];
        while (ls_exe | getline > 0) {
            if (length($0) == num) {
                print $0 " (" arr_path[i] ")";
            }
        }
        close(ls_exe);
    }
}

実行してみます。

$ nawk -f n_command.awk 1
[ (/usr/bin)
R (/usr/bin)
w (/usr/bin)
X (/usr/bin)

結果的に 2 文字のコマンドは多すぎました。

$ nawk -f n_command.awk 2 | sort -u | wc
     63     126     882

つまり 63 コマンドもあるんです。

さて、そうなってくると最も長いコマンドは何でしょうか? 少し変更して、以下のようにすることで最も長いコマンドを調べることができます。

#! /usr/local/bin/nawk -f
# longest_command.awk
# 最も長いのコマンドを探す
# usage: nawk -f longest_command.awk

BEGIN {
    num = ARGV[1];
    num_path = split(ENVIRON["PATH"], arr_path, /:/);

    ls_cmd = "/bin/ls";
    ls_opt = "-1";

    for (i = 1; i <= num_path; i++) {
        ls_exe = ls_cmd " " ls_opt " " arr_path[i];
        while (ls_exe | getline > 0) {
            if (length($0) > max) {
                command = $0;
                command_length = length($0);
                max = length($0);
            }
        }
        close(ls_exe);
    }

    print command " (" command_length ")";
}

実行してみましょう。

$ nawk -f longest_command.awk
buildsys-build-rpmfusion-kerneldevpkgs (38)

名前から Fedora の RPM Fusion 関連のもののようですが、こんなのがあるんですね。 もちろん、使ったことはありません。

tag_nawk.png tag_nawk.png tag_nawk.png tag_nawk.png