#! /usr/local/bin/ruby # /home/tetsu/src/ruby/toolbox/tail.rb # Created: August 17,2000 Thursday 19:59:29 # Author: tetsu(WATANABE Tetsuya) # $Id: tail.rb,v 1.5 2001/03/12 13:51:03 tetsu Exp $ def tail(f, opt_line, arr) begin f.seek(-32 * 1024, IO::SEEK_END) rescue Errno::EINVAL, Errno::ESPIPE end count = 0 while f.gets arr[count % opt_line] = $_ count += 1 end if count > opt_line n = opt_line else n = count count = 0 end n.times do |i| print arr[(i + count) % opt_line] end end def tailf(f) while true begin sleep 1 $_ = f.sysread(1024) print rescue EOFError end end end def skip(f, skip_lines) 1.upto(skip_lines) do break if f.gets.nil? end while f.gets print end end def usage STDERR.print "usage: #$0 [-f] [-Lines|+SkipLines] [file...]\n" exit 1 end opt_lines = 10 opt_skip_lines = 0 opt_follow = false while ARGV[0] =~ /^(?:-|\+)/ case ARGV.shift when /^-(\d+)/ opt_lines = $1.to_i when /^\+(\d+)/ opt_skip_lines = $1.to_i when /^-f/ opt_follow = true else usage end end arr = Array.new(opt_lines) case ARGV.size when 0 if opt_skip_lines > 0 skip(STDIN, opt_skip_lines) else tail(STDIN, opt_lines, arr) end when 1 else opt_filename = true end while filename = ARGV.shift f = File.open(filename) print '==> ', filename, " <==\n" if opt_filename if opt_skip_lines > 0 skip(f, opt_skip_lines) else tail(f, opt_lines, arr) end tailf(f) if opt_follow f.close end