2012-05-03 2 views
0

У меня есть fail2ban.log, из которого я хочу захватить определенные поля, из строк «Ban». Я могу захватить нужные мне данные, используя regex по одному в то время, но я не могу их комбинировать. Типичный файл журнала «fail2ban» имеет много строк. Я заинтересован в строках, как эти:Ruby script для сопоставления 3 шаблонов на ruby ​​

2012-05-02 14:47:40,515 fail2ban.actions: WARNING [ssh-iptables] Ban 84.xx.xx.242 

ого = числа (цифры)

Я хочу, чтобы захватить: а) дата и время, б) запрет (ключевые слова), с) IP-адресом

Вот мое регулярное выражение:

IP = (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})

дата & время = ^(\d{4}\W\d{2}\W\d{2}\s\d{2}\W\d{2}\W\d{2})

Моя проблема в том, как я могу объединить эти три вместе. Я пробовал что-то вроде этого:

^(?=^\d{4}\W\d{2}\W\d{2}\s\d{2}\W\d{2}\W\d{2})(?=\.*d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$)(?=^(?Ban).)*$).*$ 

но не работает, как хотелось бы.

Чтобы дать более четкий пример, вот что я хочу:

greyjewel:FailMap atma$ cat fail2ban.log |grep Ban|awk -F " " '{print $1, $2, $7}'|tail -n 3 
2012-05-02 14:47:40,515 84.51.18.242 
2012-05-03 00:35:44,520 202.164.46.29 
2012-05-03 17:55:03,725 203.92.42.6 

С наилучшими пожеланиями

+1

В общем, 'Grep Foo | awk '{bar}' 'лучше написано как просто' awk '/ foo/{bar}' ', не требуется grep. –

+0

Не могли бы вы предоставить полный признак, на котором будет работать только awk? Мой файл в этом случае называется «fail2ban.log», и я хочу захватить все строки с надписью «Запрет», а затем напечатать поле $ 1, $ 2 и $ 7. Спасибо за ваш ответ :-) –

+0

'awk '/ Ban/{print $ 1, $ 2, $ (NF-1), $ NF}' fail2ban.log' или, чтобы избежать ложных срабатываний,' awk '$ (NF -1) == «Запрет» {print $ 1, $ 2, $ (NF-1), $ NF} 'fail2ban.log' –

ответ

2

довольно прямой перевод примера

ruby -alne 'BEGIN {$,=" "}; print $F.values_at(0,1,-1) if /Ban/' fail2ban.log 

И потому, что я полагаю, вы должны хотеть их в Рубине

results = File.foreach("input").grep(/Ban/).map { |line| line.chomp.split.values_at 0, 1, -1 } 
+0

Спасибо за ответ, который сделает трюк просто отлично :-) –

1

Если размещение поля не меняется, вы даже не нужны регулярное выражение здесь:

log_line = 
    '2012-05-02 14:47:40,515 fail2ban.actions: WARNING [ssh-iptables] Ban 84.12.34.242' 

date, time, action, ip = log_line.split.values_at(0,1,-2,-1) 
Смежные вопросы