あなたが今まで打ったなかで一番長いコマンドは?

今回もみずぴー日記からですが、ここに書かれている内容はその言語を使わなくてもプログラマには非常に役に立つことばかります。パクってばっかりでスミマセン。 あなたが今まで打ったなかで一番長いコマンドは? ということですが、私はそんなに長いコマンドを打つようなことはないと思っていましたが、結構長い物を打っていることが分かりました。

私は zsh を使っています。 いわゆる zsh + screen という黄金のコンビネーションです。 ここで ~/.zshrc に以下のように設定しているとします。

function history-all { history -E 1 }

そうすることで history-all で今までの履歴を全て表示することができます。

$ history-all
    1  18.11.2008 22:13  cd pc
    2  18.11.2008 22:13  cd no-ip
    3  18.11.2008 22:13  less 1193152127.14485_1.localhost.localdomain:2,FS
    4  18.11.2008 22:13  less 1197294851.2443_1.localhost.localdomain:2,S
    5  18.11.2008 22:13  tchat
<snip>

なので、ここではこのようなデータを用いることになります。

ここでは大幅に簡略化して、最初に見つけた最大のものを表示することにします。 同じ長さのものを全て記憶してもいいのですが、awk の場合にはサクサク感が重要です。

あと、~/.zshrc に以下のように記述することで同じものは記憶されなくなります。

setopt HIST_IGNORE_ALL_DUPS

さて、awk のスクリプトです。

#! /usr/bin/gawk -f
# longest_command.awk

{
    cmd = substr($0, 26);
    if (max_length < length(cmd)) {
        max_cmd = cmd;
        max_length = length(cmd);
    }
}

END {
    print max_cmd;
}

実際に実行してみましょう。

$ history-all | gawk -f longest_command.awk
gcc -DPRINTER_MODEL=\"LITE\" -DLITE -DLIBPATH=\"/usr/local/lib/liblite.so\" \
-DRSC_PATH=\"/usr/local/etc/pipslite/pipsrc\" -DSPOOL_NAME=\"lite\" \
-DLOCALE_PATH=\"/usr/local/share/locale\" \
-DPRTOPT_PATH=\"/usr/local/etc/pipslite/prtOpt.csv\" \
-DPAPER_PATH=\"/usr/local/share/pipslite/printer/paper_list.csv\" \
-D_LPR_DIRECT -fsigned-char -DCUPS_FILTER_PATH=\"/usr/local/lib/cups/filter\" \
-g -O2 -Wall -o pipslite ekpcom.o gLoad.o getstat.o inkbox.o paper.o \
paramConf.o pferr.o pfimg.o pfmem.o pfpng.o pips.o pips1_to_2.o pipsCom.o \
pipsError.o setup.o uiModule.o uiParts.o rscCtl.o  \
../libltdl/.libs/libltdlc.al ./.libs/libcutils.al -lpthread -ldl

何をやろうとしていたのかすら覚えていませんが、こういうのは大体コンパイルが通らずに単独でビルドしようとしていた時のものです。 皆さんも意外なものが見つかるかもしれませんよ。

補足 (2009-03-20)

いろいろ有用な一行野郎を紹介してくれているCommand-line-fu というサイト (英語) がありますが、この中に同じような物がありました。 find the longest command in your history で、Perl で組まれたものです。 右下の方にタグクラウドがありますが、awk の文字が大きくなっているように awk の一行野郎も多く掲載されています。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png