隣のIPを抽出したいです(axyz-pc)
。正規表現を使用するコマンドでこれを実行しましたgrep
。しかし、awkとsedを通して抽出する必要があります。
grep -Po '(?<='axyz-pc')[^:]+' logs | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'| sort -nr| uniq -c |sort -nr
丸太:
2017-04-11 15:15:00 SMTP connection from (axyz-pc) [36.32.138.106]:1236 I=[10.10.19.36]:25 closed by DROP in ACL
2017-04-11 15:15:01 H=(axyz-pc) [114.225.87.41]:3823 I=[10.10.19.36]:25 rejected EHLO or HELO axyz-pc: HELO/EHLO - HELO on heloblocks Blocklist
2017-04-11 15:15:01 SMTP connection from (axyz-pc) [114.225.87.41]:3823 I=[10.10.19.36]:25 closed by DROP in ACL
2017-04-11 15:15:02 H=(axyz-pc) [36.32.138.216]:1984 I=[10.10.19.36]:25 rejected EHLO or HELO axyz-pc: HELO/EHLO - HELO on heloblocks Blocklist
2017-04-11 15:15:02 SMTP connection from (axyz-pc) [36.32.138.216]:1984 I=[10.10.19.36]:25 closed by DROP in ACL
2017-04-11 15:15:02 H=(axyz-pc) [37.49.224.14]:51593 I=[10.10.19.36]:25 rejected EHLO or HELO axyz-pc: HELO/EHLO - HELO on heloblocks Blocklist
2017-04-11 15:15:02 SMTP connection from (axyz-pc) [37.49.224.14]:51593 I=[10.10.19.36]:25 closed by DROP in ACL
2017-04-11 15:15:02 H=(axyz-pc) [36.32.138.106]:4619 I=[10.10.19.36]:25 rejected EHLO or HELO axyz-pc: HELO/EHLO - HELO on heloblocks Blocklist
出力は次のようになります(冗長IPは重複しません)。
36.32.138.106
114.225.87.41
36.32.138.216
37.49.224.14
答え1
なぜ停止しているのかよくわかりませんgrep
。もっと詳しく見てください。しかし、ここではperlreは必要ありません。次の操作が実行されます(少なくとも提供された例では)。
grep -o 'axyz-pc) \[[^]]*' | grep -o '[^[]*$'
出力:
36.32.138.106
114.225.87.41
114.225.87.41
36.32.138.216
36.32.138.216
37.49.224.14
37.49.224.14
36.32.138.106
次に、数字で並べ替えて適用しますuniq
。
sort -t. -k1,1n -k2,2n -k3,3n -k4,4n | uniq
出力:
36.32.138.106
36.32.138.216
37.49.224.14
114.225.87.41
答え2
必要に応じて、sed
IPが最初の角かっこにあるとします。
sed -n '/axyz-pc/s/[^[]*\[\([0-9.]*\).*/\1/p' x|sort -nr| uniq
答え3
]
awkを使用してフィールドがorで区切られていると言う場合は、[
2番目のフィールドだけが必要です。
awk -F'[][]' '
{uniqoccurences[$2]++;}
END { for (i in uniqoccurences) {
print i ":" uniqoccurences[i]
}
} '
上記の例では、各「$2」が発生した回数である「:n」も印刷していますが、これを行う必要はありません(この場合はprint i
その部分のループで行うだけですEND
)。
正規表現:文字クラスの合計が処理されるように正規表現を使用します[][]
(aの後のaは検索文字と見なされ、最初の文字の後ろ(そして最後の前)も検索文字と見なされます)。または)]
[
[...]
]
[
[
[
]
[][]
]
[
他の方法:
awk -F'[][]' '{ print $2 }' | sort | uniq
答え4
cat in.txt | awk '/SMTP/{print $7}'
これをください。
[36.32.138.106]:1236
[114.225.87.41]:3823
[36.32.138.216]:1984
[37.49.224.14]:51593
最後のステップは次のとおりです。
cat in.txt | awk '/SMTP/{print $7}' | sed -e 's/\[//; s/\]//; s/:...//'
編集:上記の$ 7は、2行のIPアドレスフィールドオフセットが異なるため機能しません。より良いアプローチは次のとおりです。
cat in.txt | awk -F "axyz-pc\) \[" '{print $2}' | awk -F"\]" '{print $1}'
最初の awk では、フィールド区切り文字として "axyz-pc" を使用し、出力を 2 番目の awk にパイプします。
代わりにsedを使用すると複雑ではありません。