У меня есть 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
С наилучшими пожеланиями
В общем, 'Grep Foo | awk '{bar}' 'лучше написано как просто' awk '/ foo/{bar}' ', не требуется grep. –
Не могли бы вы предоставить полный признак, на котором будет работать только awk? Мой файл в этом случае называется «fail2ban.log», и я хочу захватить все строки с надписью «Запрет», а затем напечатать поле $ 1, $ 2 и $ 7. Спасибо за ваш ответ :-) –
'awk '/ Ban/{print $ 1, $ 2, $ (NF-1), $ NF}' fail2ban.log' или, чтобы избежать ложных срабатываний,' awk '$ (NF -1) == «Запрет» {print $ 1, $ 2, $ (NF-1), $ NF} 'fail2ban.log' –