使用Ruby简单实现的tail命令,支持动态输出

最主要的是使用seek这个命令,从文件的末尾开始读字符。读到一个换行符 \n 之后,计数器加一,直到找到符合要求的行数后,读内容到文件末尾输出。支持 –f 部分的想法是,在文件最后的位置不断地循环读,发现新内容后就进行输出。

脚本存在的问题:不支持多个文件,tail命令本身是可以支持的;不断循环的效率太低,应该有更好的办法可以优化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/usr/bin/ruby

line = ARGV[0]
filename = ARGV[1]

unless line && filename then
print"Invalid parameter.\n"
print"Usage:ruby tail.rb line filename\n"
end

line = line.to_i

begin
io = open(filename)
n = 0
lc = 0
stack = Array.new

whilelc < line + 1 do
n = n + 1
io.seek( -n, IO::SEEK_END )
ifio.pos == 0 then
break
end
#break unless io.seek( -n ,IO::SEEK_END)
s = io.read( 1 )
if/\n/ =~ s then
lc = lc + 1
end
end

io.seek(-n, IO::SEEK_END)
s = io.read()
last = io.pos
prints

while item = io.read() do
if ! item.empty? then
print item
last = io.pos
else
io.pos = last
end
end

rescue
print$@,"\n"
end

cocowool

A FULL STACK DREAMER!