Shell のコマンド実行回数を数える

Posted by yoosee on Debian at 2008-04-19 22:00 JST

*1  Shell History | Weboo! Returns.

このネタは定期的に出てくるけど、自分では書いたことが無かった気がするので試しに。awk の切り出しは extended history で保存している都合で、切り出しカラムを $2 から $4 に変えている。

直近1000回。
% history-all|tail -1000|awk '{a[$4]++ } END{for(i in a){print a[i] " " i}}' |sort -rn|head
95 lv
59 ls
51 edic
50 ruby
48 cd
43 rm
40 mv
38 sudo
33 jdic
32 w3m
edic, jdic はそれぞれ dic コマンドを 英和・和英 で起動するための alias。

普段使っているzshでは 横着プログラミング 第3回: 履歴マニア にあるように過去の履歴をひたすら蓄積しているので、その約2万回分でカウント。
% history-all|awk '{a[$4]++ } END{for(i in a){print a[i] " " i}}' |sort -rn|head
1431 lv
1212 google
1062 sudo
960 ls
860 edic
694 w3m
688 cd
657 rm
614 mv
569 grep
なんだかやけに sudo が多いような…。

ちなみに google と言うのはコマンドラインから w3m に google 検索パラメータを投げるだけのプログラム。
#!/usr/bin/perl

my $arg = join("+", @ARGV);
my $q=`echo $arg | nkf -w`;
system("w3m \"http://www.google.com/search?lr=lang_ja&q=$q\"");
コンソール上で生活していると、これが意外と便利。

*1  日本語ファイル名をローマ字に変換する ruby + kakasi script

Palm TX で使っている pTunes が例によってSDカード上の日本語ファイルを扱ってくれない(id3tagは大丈夫だがファイルリストに表示されない)ので、ディレクトリ名・ファイル名をローマ字に変換するスクリプトを書いた。引数にディレクトリを指定すると recursive に日本語ファイル名をローマ字に変換する。処理には libkakasi を使用して、前段では -w での分かち処理もしている。また空白はアンダーラインに変換。割と破壊的なので利用には注意を。
#!/usr/bin/ruby

require 'kakasi'
require 'find'
require 'nkf'

def romanize_dir dir
  Find.find(dir) do |fpath|
    next if NKF.guess(fpath) == 5 && !/\s+/ =~ fpath # ascii or whitespace
    begin
      filename = Kakasi.kakasi('-w', NKF.nkf('-e',fpath)).gsub(/\s*\/\s*/, '/')
      filename_roman = Kakasi.kakasi('-Ha -Ka -Ja -Ea -ka', filename)
      filename_roman.gsub!(/\s+/, '_').gsub!(/\^/,'-')
    rescue
      puts "failed to convert string #{fpath} - #{$!}:#{$@}"
      next
    end

    begin
      File.rename(fpath, filename_roman)
      puts fpath + " to " + filename_roman
    rescue
      puts "failed to convert filename #{fpath} - #{$!}:#{$@}"
    end
    if(File.directory? filename_roman)
      puts " + into directory #{filename_roman}"
      romanize_dir filename_roman
    end
  end
end

dir = ARGV.shift
romanize_dir dir
Windows だと同様の用途には Flexible RenamerGanmigi と言ったものがあるみたい。試してはいない。

*1  リモートサーバに ssh pubkey を登録するワンライナー

そういうものが欲しくてちょっと試した。
 % cat ~/.ssh/id_dsa.pub | ssh remotehost "xargs echo >> .ssh/authorized_keys"
で一応うまくはいった。もちろんこの時点では remotehost 側が PasswordAuthentication yes になっている必要はある。xargs を使うのが美しくない気がするが、他にいい手はあるだろうか。

*1  Debian lenny/sid での utf-8 環境移行メモ

サーバを入れ替えたタイミングで、なんとなしに terminal 環境を今までの euc-jp 中心から utf-8 に切り替えたのだが、結構あちこち変更するハメになったので、まだ完璧ではないが設定を記録しておく。文字コードの問題はまだしも、East Asian ambiguous char width 周りの問題が鬱陶しい上にスマートで包括的な解決方法が無い。最新の環境にしたのに Bad Knowhow が増えるというのは困ったもんだ。

locale: /etc/locale.gen に以下の行が無い場合は追加して locale-gen を実行
ja_JP.UTF-8 UTF-8
zsh: .zshrc
export LANG=ja_JP.UTF-8
export OUTPUT_CHARSET=utf-8
export LV="-Ou8"
screen: .screenrc
defencoding     UTF-8
vim: .vimrc
set termencoding=utf-8
set fileencodings=iso-2022-jp,cp932,utf-8,japan
set ambiwidth=double
emacs21 では mule-ucs パッケージを入れて un-define を require する。emacs22 では無くても utf-translate-cjk-mode があるので(CJKだけなら)一応使える。
emacs21/22: .emacs
(when (<= emacs-major-version 21)
   (require 'un-define))
(set-language-environment "Japanese")
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-buffer-file-coding-system 'utf-8)
(set-selection-coding-system 'utf-8)
(setq default-buffer-file-coding-system 'utf-8)
(prefer-coding-system 'utf-8)
これで概ね問題ないが、ambiguous char width を回避するために Emacs22 + UTF-8 における文脈依存な文字幅の問題について のような設定を入れておく。

w3m
特に設定しなくても LANG(LOCALE) に追従して「表示用文字コード」が Unicode (UTF-8) になってくれた。しかし画面表示とカーソル位置がずれていたり画面にゴミが残ったり(再描画すると直る)と、鬱陶しいことになっている。

Gnome, gnome-terminal
特に設定しなくても .xsession から X を LANG=ja_JP.UTF-8 で起動したら対応した。ただ困ったことに、gnome-terminal で utf8 の EastAsian Ambiguous char width 問題の解決策が見当たらない。VTE_CJK_WIDTH を設定する方法は etch では機能せず。仕方がないので xterm -cjk_width ないし mlterm -a 2 の方を使う方針にする。mlterm の方が antialias が綺麗なんだけど、URL link 等の右クリックメニュー機能が無くなったのがちょっと痛い。

PuTTY on Windows
設定から Window > Transrations を [UTF-8] に、Treat CJK ambiguous character as wide をチェック。PuTTY Tray を使っているけどこれで特に問題は無い。CJK以外の多国語を使う場合・terminal の文字コードが混在する場合には問題が出るのかもしれない。

参考

*1  w3m + cacaview で captcha 画像の文字が読める

w3m + cacaview(libcaca)putty 上の w3m で某所 blog を読むに、コメント時に captcha 認証を求められ、X 上ならともかく画像が表示できない terminal 上で画像認証は鬱陶しいなと思ったが、なにげに cacaview (libcaca) がアスキーアートで十分可読な表示をしてくれた。ちなみに画像の表示は画像部分の上にカーソルを持っていき I を押す。libcaca は 動画の再生もこなしていたし、なんとも恐るべし。

*1  void GraphicWizardsLair( void ); // コマンドラインインターフェースとQWERTYキーボードは英語圏ユーザーには良いが、日本語を扱うのはまどろっこしい

最近の Linux, *BSD ならば utf-8 や euc-jp でファイル名を扱ってもさほどトラブルになることはないし、samba との関係や音楽ファイルの ripping でもファイル名を日本語にすることは昔に比べて増えていると思うのだけど、いざそうなって思うのはコマンドラインから日本語を入力してファイル操作することの繁雑さ。

CLI 使いなら Tab(ないし何かのキー) でのファイル名補完は当然ながら常套手段と言う以上に指に染み付いたアクションだろうが、英語ファイルなら 1,2 文字 + Tab であらゆるファイルを候補に挙げられるのに対し、日本語ファイルでは「IMEをONにする」→「ファイル名の先頭を構成する漢字やかなを数文字入力」→「(漢字やカタカナの場合)変換」→「Tab」と言う非常に繁雑な手順を踏む必要がある。
ならば日本語ファイル名を使わなければいいという話なのだけど、単純に ls 等でファイル名を確認する場合には「ローマ字日本語」と「漢字かな日本語」の読みやすさの違いには当社比17倍くらいの差があるわけで、なかなか悩ましい。

現実解としては「日本語ファイル名」+「zsh の補完機能に migemo」と言う形が良さそうかと思うんだけど、誰かそうした実装ないし使い方をしている人はいないだろうか。

*1  404 Blog Not Found:勝手に添削 - find(1)

find の話題が盛り上がっているようだが、「last-modified が30日以上前のファイルを特定ディレクトリに退避」なんて処理にはよく find を使う。特に spam や virus 等、一時保存してその後は破棄するようなデータには cron で仕掛けておいても便利だ。
find .spam/cur/ -daystart -mtime +30 -exec mv \{\} ~/tmp/oldspam/ \;
ファイル名検索には -name だけでなく -regex や -iregex で正規表現を指定するのも便利なことがある。また -exec に関しては、代わりに -ok を使うと exec 前に実行の確認が出来るので覚えておくと良い (RETだけだと処理がスキップされる)。

ところで find に限らず CLI のコマンドは、同じ事をやる方法が複数存在する事が多い。実際問題として「より効率的な専用手段を覚える」のと「効率は多少落ちてもより汎用的な手段を覚える」のどちらがいいかというのは、限られた時間の中で常に付きまとう問題だろう。個人的には汎用的な方法を覚えた上で専用手段に手を伸ばすのが良い道だろうと思う。とはいえファイル検索に関しては find 自体が「汎用性の高い手段」だというのも否めないので、特にシステム管理者は精通して損はない。例えばアカウント管理をする人は -uid -nouser -perm あたりの存在を覚えておくと便利な事もあるだろう。

*2  zsh の履歴機能と補完機能を有効に使おう

上記のように、往々にして find の構文は複雑になる事が多いし、また似たようなことをしばらく経ってから再度やることも多い。そうした際に非常に役に立つのは過去の履歴なのは言うまでもない。zsh の場合、横着プログラミング第3回: 履歴マニア にあるように HISTSIZE と SAVEHIST を 100000 程度残しておくのは将来の自分の手間を軽減するという意味で非常に役に立つ。また zsh の compinit を使えば find -<tab> のようにオプション名の補完リストを出すことも出来る。

*3  余談: ls -l の結果を更新時間順(の逆順)に表示

これとは直接関係ないが、タイムスタンプを元にしてファイルを見つけ出す話関連で、しばらく前にどこかの blog で見かけた ls -l を last-modified 逆順に並べる alias を紹介。
alias ll='ls -lAFtr'
これで ll と叩くと、最近編集されたファイルがリストの一番下の方に出てくる。特にこれは /var/log なんていう、ファイルが大量で、かつ最新の更新があるファイルの重要度が高い場合に重宝する。例えば普通に ls -lF /var/log/ だと
# ls -lF /var/log/ 
....
-rw-r--r--  1 root     root             0 2007-02-05 14:12 uucp.log
-rw-rw-r--  1 root     utmp        202752 2007-03-31 18:00 wtmp
-rw-rw-r--  1 root     utmp        366720 2007-03-07 20:14 wtmp.1
-rw-r--r--  1 root     root         12063 2006-07-01 06:52 wtmp.report
drwxr-xr-x  2 root     root          4096 2007-02-05 13:58 xfer/
となり、肝心の部分はスクロールで流れてしまう。だが ls -lAFtr ならば
# ls -lAFtr
....
-rw-r-----  1 root     adm        1867000 2007-04-01 00:54 messages
-rw-r--r--  1 root     root       9217099 2007-04-01 00:59 spamd.log
-rw-r--r--  1 root     root        246828 2007-04-01 01:05 sensord.rrd
-rw-r-----  1 root     adm      150206935 2007-04-01 01:08 mail.log
-rw-r-----  1 root     adm       33062997 2007-04-01 01:09 auth.log
-rw-r-----  1 root     adm       15799201 2007-04-01 01:09 syslog
-rw-r-----  1 root     adm        3486279 2007-04-01 01:09 daemon.log
きっちり最近変更があったファイルが最後の方に出てくれる。

CLI 2.0 時代の到来

Posted by yoosee on Debian at 2006-12-11 23:42 JST

*1  Command Line Interface 2.0

Binary 2.0 あたりに触発されて、と言うかネタとして単語を思いついただけだけど。

正直まわりを見ていると、未だに shell history の incremental search を使っていなかったり、tab による補完を効かせてなかったり、はたまた 1台のサーバ上で複数の shell を立ち上げるために TeraTerm を 5個も 6個も立ち上げていたりと言う人をエンジニアの中でも結構見掛ける。

Bad Knowhow だと言われようとも、ssh, screen, w3m, zsh, vim, emacs あたりの便利な使い方は確実に人生を豊かにしてくれる。その上、なんと コマンドラインはモテるのである。まさに時代は CLI と言えよう。Hacks になったら面白いかなと思ったけど、個々のノウハウが膨大かつ広範囲だから難しいかな。好きな人は多そうだけど、その分だけ収集もつかなさそう。

*1  カラーのアスキーアートライブラリ libcaca

しばらく前になるが、w3m で web を閲覧中、動画のリンクをクリックした際に、ダウンロードが開始することを期待していた目の前で、突如アスキーアートの動画再生が始まった。その時はその時で驚いたものだが、今日ふと話題に上がったので試してみると、今どきのアスキーアート動画再生はカラーで再生されるらしい → VLC で再生したアスキーアート動画を撮影したもの (Xvid 617KB)
IRC で教えて貰ったところによると、画像の AA化で有名な aalib とは別の、libcaca - Colour AsCii Art library と言うものを使っているらしい。vlc では libcaca_plugin.so と言うプラグインで機能を取り込んでいるようだ。mplayer だと mplayer -vo caca として使える。

*2  アスキーアートムービー

過去には telnet で繋ぐと sl コマンドのように動画の AA が見られる Starwars Asciimation と言うサイトがあったが、今でも telnet で繋いでちゃんと見られる上に IPv6 から繋ぐとカラー化もされている。

About W.W.Walker

World Wide Walker は yoosee による blog です。PDA, Web・サーバ技術, 美味しい食べ物などの話題を取り上げています... read more

Monthly Archives

Select Month to read
  

Ads

Recent Entries

Related Sites