透過awk和sed提取訊息

透過awk和sed提取訊息

我想提取旁邊的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分隔[,我們只需要第二個欄位:

awk -F'[][]'  '
     {uniqoccurences[$2]++;}
 END { for (i in uniqoccurences) {
            print i ":" uniqoccurences[i] 
        } 
     } '

在上面的例子中,我還列印了“:n”,即每個“$2”出現的次數,但沒有必要這樣做(在這種情況下,只需print i在該部分的循環中執行即可END

正規表示式:使用正規表示式對待字符類別中的和 的[][]方式(a 之後的 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 不起作用,因為兩種線路的 IP 位址欄位偏移量不同。更好的方法可能是:

cat in.txt | awk -F "axyz-pc\) \[" '{print $2}' | awk -F"\]" '{print $1}'

我們將使用“axyz-pc”作為第一個 awk 中的字段分隔符,然後將輸出通過管道傳輸到第二個 awk。

使用 sed 代替,並不複雜。

相關內容