使用awk从返回中删除值

时间:2013-02-14 03:13:28

标签: awk grep iptables

我不确定如何从这些行中删除“DST =”.. 这是我的命令(它返回它应该的东西),如果有更有效的方式或更好的方式,请随意批评。

awk '{print $10}' iptables.log |sort -u

DST=96.7.49.64
DST=96.7.49.65
DST=96.7.50.64
DST=98.27.88.26
DST=98.27.88.28
DST=98.27.88.45
DST=98.27.88.50

如您所见,我需要从iptable日志中获取唯一的ip。

谢谢!

4 个答案:

答案 0 :(得分:2)

如果你不介意未排序的输出,这是使用awk的更好方法:

awk '!a[$10]++ { sub(/DST=/,"",$10); print $10 }' file

答案 1 :(得分:1)

您可以通过sed输出输出结果,从每行中删除DST =:

awk '{print $10}' iptables.log | sed 's/^DST=//' | sort -u

答案 2 :(得分:1)

或者你可以将它全部保存在一个过程中,并使用awk的等效sub()函数,即

awk '{sub(/DST=/,"",$10); print $10}' iptables.log |sort -u

<强>更新

  

无论如何只能在DST上键入=无论它是在空间10还是11?

awk '$10~/^DST=/{sub(/DST=/,"",$10); print $10};$11~/^DST=/{sub(/DST=/,"",$11); print $11}' iptables.log | sort -u

OR

awk '{for (i=9;i<13;i++) {
 if ($i ~ /^DST=/) { sub(/DST=/, "", $i); print $i}
 }
}' iptables.log | sort -u

请注意,在这里,您可以更改要检查和打印的字段范围,我只是测试字段9-12。 awk中的变量如$i引用当前行中的i'th'元素,就像$ 1,$ 9,$ 87等等。

由于我没有iptables.log来测试,我无法测试它,除非确认awk语法没有失败。这不起作用,请发布2-4行简化数据。

IHTH

答案 3 :(得分:1)

awk '{split($10,a,"=");b[a[2]];next}END{for(i in b)print i}' iptables.log