[戻る] [ゲストブック(書込)] [ゲストブック(閲覧)]

fcatコマンド

概要

例えば、特定のディレクトリにあるテキストファイルをすべてcatして、パイプを 通してgrepによる検索をかける、なんてことはよくあるが、この方法は次の疑問に 応えてくれない;

検索にひっかかったテキストは、どのファイルに入ってたの?

そこで作ったのがfcatである。どう便利かは、実行結果を見れば一目瞭然。

ui.txt :  快適ユーザインターフェース計画
ui.txt :  
ui.txt :  Linuxを使い始めて3年になるが、その間にデスクトップの環境は幾度となくがら
ui.txt :  りと一変している。より使いやすい(そしてカッコイイ)UIを求め、様々な環境を
ui.txt :  試したからである。かくしてTrial&ErrorによるUIレビューが出来上がったため、
ui.txt :  ここらで情報として公開しておこうと思う。
ui.txt :  
ui.txt :  私が過去に実際使用した環境についてのレビューを、気に入っている順に書く。
ui.txt :  
ui.txt :  なお、使用している環境はCeleron 400MHz,RAM 192MB,1024x768で、快適性
ui.txt :  などはこのスペックが基準である。ご参考までに。
ui.txt :  

(以降省略)

これで、複数ファイルにまとめてgrepかけても、テキストの身元がちゃんと分かる。

プログラム概要

01: #!/usr/bin/ruby
02: 
03: sft=0; fnote=0
04: 
05: while (ARGV[sft]!=nil)
06: 
07:   begin
08:     if (ARGV[sft]!=nil)
09:       file = open(ARGV[sft],"r")
10:     end
11:   rescue
12:     STDERR.print "fcat : failed to open file ",ARGV[sft],"\n"
13:     sft += 1
14:     retry
15:   end
16: 
17:   if (ARGV[sft]!=nil)
18:     begin
19:       while (a = file.gets)
20: 	STDOUT.print ARGV[sft]," :  ",a
21:       end
22:     rescue
23:     end
24:   end
25: 
26:   sft += 1
27: end
1行目
このスクリプトを動かすにはrubyが必要である。
7行目から15行目
引数にとったファイル名を順次オープンする。ファイルが存在しなければエラー を出した上で次のファイルに移る。
17行目から24行目
ここで実際の表示。なお、途中でファイル読み込みに失敗するとその段階で終 了して次のファイルに移る。

使い方

このプログラムは単独のファイルにたいして使っても意味が無い(と思う)。実際は、 冒頭に書いたように次のような使い方が標準となる。

$ ls
Kondara2.1_1  Kondara2.1_3  RedHat7.1_2  Turbo7.0_2  Vine2.5 
Kondara2.1_2  RedHat7.1_1   Turbo7.0_1   Vine2.1    

$ cat Vine2.5 | head -n 10
Canna-3.5b2-39.i386.rpm
Canna-devel-3.5b2-39.i386.rpm
ElectricFence-2.1-3vl3.i386.rpm
FreeWnn-1.1.1-1vl10.i386.rpm
FreeWnn-common-1.1.1-1vl10.i386.rpm
FreeWnn-devel-1.1.1-1vl10.i386.rpm
GConf-1.0.7-0vl2.i386.rpm
GConf-devel-1.0.7-0vl2.i386.rpm
ImageMagick-5.2.9-0vl6.i386.rpm
ImageMagick-c++-5.2.9-0vl6.i386.rpm

$ fcat * | grep gtkmm     <←ここで使う>
Kondara2.1_2 :  gtkmm-1.2.8-2k.i586.rpm
Kondara2.1_2 :  gtkmm-devel-1.2.8-2k.i586.rpm
Kondara2.1_2 :  gtkmm-doc-1.2.8-2k.i586.rpm
Turbo7.0_2 :  gtkmm-1.2.5-3.i586.rpm
Turbo7.0_2 :  gtkmm-devel-1.2.5-3.i586.rpm

$ 
上の例は、実際に私のディレクトリにある「パッケージリスト」ファイルである。 つまりは各ディストリビューションのインストールCDに含まれるRPMパッケージを リスト化したファイルで、これにfcatで検索をかけることで、調べたいパッケージ がどのディストリビューションの何番目のCDに入っているのか分かるのである。

Since 2002 by mita-K. @Geo-SiliconValley-4305