寻找一种简单的ruby / bash解决方案来调查日志文件,例如apache访问日志。
我的日志包含以“ 授权:”开头的行。
该脚本的目标是返回整个下一行,但返回此匹配项后的一行,其中包含字符串“ x-forwarded-for ”。
host: 10.127.5.12:8088^M
accept: */*^M
date: Wed, 19 Apr 2019 22:12:36 GMT^M
authorization: FOP ASC-amsterdam-b2c-v7:fkj9234f$t34g34rf=^M
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0)
x-forwarded-for: 195.99.33.222, 10.127.72.254^M
x-forwarded-host: my.luckyhost.com^M
x-forwarded-server: server.luckyhost.de^M
connection: Keep-Alive^M
^M
我的问题与if条件有关。 如何从readline获取行号/呼叫者,然后在第二步中用 x-forwarded-for 返回整行。
file = File.open(args[:apache_access_log], "r")
log_snapshot = file.readlines
file.close
log_snapshot.reverse_each do |line|
if line.include? "authorization:"
puts line
end
end
答案 0 :(得分:1)
也许遵循以下原则:
log_snapshot.each_with_index.reverse_each do |line, n|
case (line)
when /authorization:/
puts '%d: %s' % [ n + 1, line ]
end
end
其中each_with_index
用于生成0索引的行号。我已切换为case
样式,因此您可以在匹配不同条件时具有更大的灵活性。例如,您可以添加/i
标志以真正轻松地进行不区分大小写的匹配,或者在开头添加\A
并将其锚定在字符串的开头。
考虑对File.open
使用block方法的另一件事,例如:
File.open(args[:apache_access_log], "r") do |f|
f.readlines.each_with_index.reverse_each do |line, n|
# ...
end
end
可以消除对显式close
调用的需要。块的结尾会自动为您关闭。