Номер строки возврата с Ruby readline - PullRequest
0 голосов
/ 25 апреля 2019

поиск простого решения 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 Ответ

1 голос
/ 25 апреля 2019

Может быть, что-то вроде этого:

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 используется для генерации нумерованных номеров строк. Я переключился на стиль case, чтобы вы могли иметь больше гибкости в подборе различных условий. Например, вы можете добавить флаг /i, чтобы действительно легко сопоставить регистр, или добавить \A в начале, чтобы закрепить его в начале строки.

Еще одна вещь, которую стоит рассмотреть для использования метода блока для File.open, например:

File.open(args[:apache_access_log], "r") do |f|
  f.readlines.each_with_index.reverse_each do |line, n|
    # ...
  end
end

Где это устраняет необходимость явного вызова close. Конец блока закрывает его для вас автоматически.

...