我想提取旁边的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 代替,并不复杂。