2012-05-03 80 views
0

我有一個fail2ban.log從中我想從「禁止」字符串中獲取特定字段。我可以在當時使用正則表達式獲取我需要的數據,但我無法將它們合併。典型的'fail2ban'日誌文件有很多字符串。我感興趣的字符串這樣的:用於匹配ruby上的3個模式的Ruby腳本

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

XX =數字(數字)

我要搶:a)日期和時間,B)班(關鍵字),C)的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的富希望他們| 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)