Home

技術系のメモと日々の雑感

標準出力のキーワードをハイライト

処理結果を標準出力に書き出すコマンドで特定のキーワードをハイライトさせる方法を見付けた。
たとえば tail -f なら

tail -f messages | perl -pe 's/[Ee]rror/¥e[1;31;43m$&¥e[0m/g'

で Error や error をハイライトすることができる。
もちろん tail 以外のコマンドでも利用可能だ。

top | perl -pe 's/httpd/¥e[1;31;43m$&¥e[0m/g'

なんて使い方もあるね。
何気に便利なのでメモ。

pagead2.googlesyndication.com へのアクセス回避

近頃、Web サイトを表示したときに pagead2.googlesyndication.com へのアクセスが発生して、ものすごく待たされることが増えてきた。
Google の AdWords とか AdSense 関係らしいけど。
自慢じゃないがうちのマシンはボロいので、このアクセスが発生すると CPU を使い切ってブラウザがしばらく固まってしまうのだ。
で、さすがに耐えられなくなって回避する方法を調べてみた。
Sleipnir をはじめ IE 系ではこのアクセスをうまく止める方法はないらしく、根本的な解決策ではないけど、%windir%¥system32¥drivers¥etc¥hosts の中に

127.0.0.1 pagead2.googlesyndication.com

を書いて、無理矢理ローカルを見にいかせるようにすればとりあえず回避できるという情報を発見。
考えたもんだなぁ。
ページの一部がロードできずにエラーの表示になったりするけど、まぁ、見たい部分は大丈夫だから気にしないでおこうと思っていた。
ところが、その後試しに pagead2 を外して

127.0.0.1 googlesyndication.com

に変えてみると、なんと表示も乱れることなくロードも速くなるじゃないか!
理由はまったく分からないけど、今はこれで様子見だ。

ls の出力をぎゅっと詰めてみる

単なる暇つぶしだけど。
ls -m を実行したときに行末に空白が残ってちょっと見栄えが悪かったのと、もっと詰めて表示させたらどうなるかと思って、退屈しのぎに考えてみた。

$ unalias ls
$ ls -1 --color=always | tr '¥n' ' ' && echo

こんな感じかな。
先に unalias してるのは、-F オプション付きで alias が効いてる場合があるのでそれを外したかったという、ただそれだけの理由。
/etc とか /usr/bin で実行すると結構迫力あるね。
ひょっとしたら何か使い道があるかも。

bash も使ってる hash

ハッシュ聞くと最初に思いつくのは perl の連想配列だけど。
こないだから再読しているオライリーの「入門 bash」によると、コマンドの検索速度を上げるために bash もハッシュを使っているんだとか。
コマンドを初めて実行するときよりも2回目以降の方が速いのは、てっきり Linux のキャッシュの処理が優秀なだけかと思ってたけど、bash も工夫してるんだね。
ハッシュテーブルに登録されているコマンドは hash コマンドで確認することができる。

$ hash
hits    command
   1    /bin/grep
   1    /usr/X11R6/bin/startx
   1    /bin/rm
   3    /bin/vi
   1    /usr/bin/man
   2    /usr/bin/find

コマンドごとに何回実行したか(hits)というのも分かって面白い。
でも、これって何の順番で並んでるんだろ。
ハッシュテーブルに追加された順番でもないし、謎だ。
このハッシュの機能は PATH(環境変数)をたどって外部コマンドを探すためのものなので、当然ながら bash の組み込みコマンドは表示されない。
で、kill も組み込みコマンドだったのか、なんて驚いてる自分がちょっと情けなかったり。
ちなみに、組み込みコマンドについて調べたいときは bash の man ページよりも help の方がよくまとまってるみたいだ。

もっと bash の補完機能を使い倒す

bash の man ページを見ていたら、補完機能はコマンドやパスだけではなく、シェル変数やユーザ名やホスト名にも使えると書かれていた。
今まで使ったことがなかったのが不思議なぐらいだ。
で、意外と知られてなさそうなので書いておくことにした。
まず、$ で始まる文字列に続けてタブを入力するとシェル変数が補完される。
たとえば echo $HISTS[Tab] といった使い方だ。
当然だけど、タブを2回入力するとリストしてくれる。

# $[Tab][Tab]    ※抜粋
$BASH               $JSERVER            $SHELLOPTS
$BASH_ENV           $LANG               $SHLVL
$BASH_VERSINFO      $LESSOPEN           $SSH_ASKPASS
$BASH_VERSION       $LINENO             $SSH_CLIENT
$CANNA_SERVER       $LINES              $SSH_CONNECTION

set | grep hoge するより簡単だね。
チルダ「~」だとユーザ名の補完。
cd ~ro[Tab] で cd ~root に補完するといった感じだ。
やはり、リストもしてくれる。

# ~[Tab][Tab]    ※抜粋
~adm        ~ftp        ~lp         ~nobody     ~rpcuser    ~uucp
~apache     ~games      ~mail       ~nscd       ~rpm        ~vcsa
~avahi      ~gdm        ~mysql      ~operator   ~shutdown   ~xfs
~bin        ~gopher     ~nagios     ~postfix    ~sshd
~daemon     ~haldaemon  ~named      ~root       ~sync

そして @ の場合はホスト名の補完。
/etc/hosts を参照しているみたいなので、ここに書いてあるホスト名なら、たとえば ssh web@ex[Tab] で ssh web@example.com に補完してくれる。
もちろん、これもタブ2回でリストしてくれる。

# @[Tab][Tab]
@localhost              @hoge                 @hoge.localdomain
@localhost.localdomain  @example.com

で、この3つのパターンに該当しないときに初めて、コマンドやパスの補完が実行されるそうだ。
ちなみに、オライリーの「入門 bash」を見たら最初の方にちゃんと書かれてた。
ずっと昔に読んだはずなのに・・・。