用Ruby readline返回行号

时间:2019-04-25 19:01:14

标签: ruby readline

寻找一种简单的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

1 个答案:

答案 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调用的需要。块的结尾会自动为您关闭。