0

我有一个fail2ban.log,我想从'Ban'字符串中获取特定字段。我当时可以使用正则表达式获取我需要的数据,但我无法将它们组合起来。典型的“fail2ban”日志文件有很多字符串。我对这样的字符串感兴趣:

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

xx = 数字(数字)

我要获取:a) 日期和时间,b) 禁令(关键字),c) 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

最好的祝福

4

2 回答 2

2

该示例的非常直接的翻译

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

而且因为我认为您必须从 Ruby 中获取它们

results = File.foreach("input").grep(/Ban/).map { |line| line.chomp.split.values_at 0, 1, -1 }
于 2012-05-04T00:58:46.890 回答
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)
于 2012-05-04T00:55:56.793 回答