2

我不知道如何从这些行中删除“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

4 回答 4

2

如果您不介意未排序的输出,这里有一个更好的使用方法awk

awk '!a[$10]++ { sub(/DST=/,"",$10); print $10 }' file
于 2013-02-14T03:36:18.883 回答
1

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

awk '{print $10}' iptables.log | sed 's/^DST=//' | sort -u
于 2013-02-14T03:19:57.647 回答
1

或者您可以将其全部保存在一个进程中,并使用 awk 的等效sub()功能,即

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

更新:

不管它是在 10 号还是 11 号空间,有没有只在 DST= 上键入?

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

或者

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

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

由于我没有要测试的 iptables.log,因此我无法对其进行测试,除非确认 awk 语法没有失败。如果这不起作用,请发布 2-4 行简化数据示例。

IHTH

于 2013-02-14T03:22:30.467 回答
1
awk '{split($10,a,"=");b[a[2]];next}END{for(i in b)print i}' iptables.log
于 2013-02-14T12:17:06.760 回答