このファイルでは、security.log
DNSBL 5 ランクが最も高い IP アドレスがいくつかあることを確認する必要があります。ファイルの1行は次のとおりです。
Oct 24 00:00:28 MAIL-00 postfix/postscreen[10909]: dnsbl rank 5 for [103.129.47.51]:50807
DNSBLランキングを使用してIPアドレスをフィルタリングするには、次のようにしました。
grep "ip" security.log | grep -i "DNSBL" security.log
あるいは、役に立つシェルスクリプトを書くこともできます。次のようなことを考えています。
#!/bin/bash
#grep every ip with "dnsbl rank 5"
#count the amount of times each unique one appears, create variable with IP and value is the number of times it appears
#Find the variable with the biggest value and output the variable name to screen
スクリプトは他のコンテンツを削除する必要があるため、検索する出力は以前に「dnsbl ran 5」があったIPのリストにすぎません。私はcut
これを長い間使用していません。これは括弧内にIPだけを得るための最良の方法ですか?
誰でも私を助けることができればとても感謝します!
答え1
行が表示されている行と常に似ている場合は、次のことができます。
sed -nE 's/.*dnsbl rank 5.*\[([0-9\.]+)\].*/\1/pi' test.log | sort | uniq -c | sort -nr | head -n 1
sedコマンドは「dnsblrank 5」を含む行のみを印刷しますが、そのフレーズの後の括弧のペアのエントリを除くすべてのエントリを削除します。次に、最初の sort コマンドは一致するすべてのアイテムを収集し、uniq コマンドは一致するアイテムの数を計算します。一致する項目の数 ip 、2番目のソートは順番にソートされ、headコマンドは最初の1を使用します。
出力は次のようになります。
4 103.129.47.51
dnsblランク5のIPアドレスが他のものよりも4回表示される場合。
ただし、これが実際に関係を説明するわけではなく、データは一貫した形式でなければなりません。
答え2
awk '/dnsbl rank 5/{for(i=1;i<=NF;i++){if ($i ~ /[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}/){gsub(/\].*/,"",$i);gsub(/\[/,"",$i);print $i}}}' filename| awk '{a[$1]++}END{for(x in a){print x,a[x]}}'| sort -k2 -nr
これが役に立つかもしれません