hirax.net::Keywords::「ファイル末尾」のブログ



2010-03-01[n年前へ]

Rubyで"tail" 

 ファイル末尾を表示するコマンドtailをRubyで色々なやり方で(そして最適なやり方で)実装しようというRuby: フィルタコマンド/tail

 tail コマンドって知っています? Unix 系のシステムでは、ファイルの終りだけを表示するコマンドとして使用されています。
  実現方法の考え方(アルゴリズム)の勉強にとてもいい課題になっています。 最初は基本的なアプローチで、できたら大きなファイルでもうまく動くような方法を考えてみてください。

2010-03-02[n年前へ]

ファイル末尾からn行目を高速に読み込むRuby関数 

 他アプリケーションが書き出すログファイルを、刻々Rubyで読み・内容に応じた処理をさせたい、と思う状況もままある、と思います。そんな時、ログファイルを逐一読むと時間がかかってしまうので、保存されているログファイルの末尾から2行目だけを読みたくなります。

 ファイル末尾からなぜ2行目を読むかというとそれは、ファイル末尾行は書きだし中で、欲しい情報には十分ではない、というような理由です。そこで、Rubyで書いた「ファイル末尾からn行目を高速に読む」関数を、ここにメモしておきます。

 この関数"tail"の引数は、

  • filename:開きたいファイル
  • line:末尾から何行目を出力する(返す)か
  • readLength:末尾から何バイト(だけ)を読みこみ、処理させるか
  • ら行目の内容を出力する、という具合です。
というようになります。下記のスクリプト例では、ログファイルの末尾64バイトだけを読み込み、その上で、ファイル末尾から2行目を出力する、ということを続ける例になります。
def tail(filename,line,readLength)
  ary=[]
  f=File.open(filename)
  begin
    f.seek(-readLength,IO::SEEK_END)
  rescue
end
  while f.gets
    ary<<$_
  end
  f.close
  return ary[ary.length-line]
end

while true
  puts tail(ARGV[0],1,64)
  sleep 1
end
このスクリプトを、tail.rbというような名前で保存し、
ruby tail.rb readme.txt
とすれば、その瞬間に保存されているreadme.txtの下から2行目を出力し続ける、ということがされます。

 Rubyで他アプリケーションのログファイルをリアルタイム監視して、何らかの動作・制御を行わせたい・・・という実に「ニッチ」な用途のスクリプトです。しかし、同じようなことをする状況の人も多いかもしれない、というわけで、今日は、ここにメモしておくことにします。



■Powered by yagm.net