名前の一部からコマンドを検索

名前の一部からコマンドを検索する - 憩いの場 にインスパイヤされて、awk で同様のことをやってみます。

名前の一部からコマンドを検索する - 憩いの場 では find コマンドを使っていますが、ここでは環境変数 PATH と ls コマンドの出力を使って調べます。 ls コマンドからの取り込みは getline を用いてできますが、close() でクローズするのを忘れないように注意してください。 実行形式かどうかは ls コマンドの -F オプションを使って判断しています。

#! /usr/local/bin/nawk -f
# which2.awk
# 部分一致の which
# usage: nawk -f which2.awk command_name

BEGIN {
    command_name = ARGV[1];

    path = ENVIRON["PATH"];
    num_path = split(path, arr_path, /:/);

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

    for (i = 1; i <= num_path; i++) {
        ls_exec = ls_cmd " " ls_opt " " arr_path[i];

        while ((ls_exec | getline) > 0) {
            file = $0;

            # Executable
            if (file ~ /[*@]$/ && file ~ command_name) {
                sub(/[@*]/, "", file);
                print arr_path[i] "/" file;
            }
        }
        close(ls_exec);
    }
}

実行してみると以下のように表示されます。

$ gawk -f which2.awk awk
/usr/bin/awk
/usr/bin/gawk
/bin/awk
/bin/gawk
/bin/igawk
/bin/pgawk

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