0

'Ban'文字列から特定のフィールドを取得したいfail2ban.logがあります一度に1つずつ正規表現を使用して必要なデータを取得できますが、それらを組み合わせることができません。典型的な「fail2ban」ログファイルには多くの文字列があります。私はこれらのような文字列に興味があります:

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})

ここでの私の問題は、これら3つをどのように組み合わせることができるかということです。私はこのようなことを試みました:

^(?=^\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 に答える