使用awk从返回中剔除值

使用awk从返回中剔除值,awk,grep,iptables,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 谢谢 您可以通过sed将

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


谢谢

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

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

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

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

不管其位于空间10还是空间11,是否仍可以仅在DST=上设置关键点


awk'{for(i=9;i如果您不介意未排序的输出,这里有一个更好的方法使用
awk

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

谢谢!!太完美了!好老的awk/sed:)有时候我讨厌来自windows背景。谢谢你的信任,但是@SHEENT有一个更优雅的解决方案(我相信你已经注意到!)你们太棒了..这很有效..所以更有效的方法是将所有的数据保持在一个正确的位置..我知道,很明显,只是要确保,这将每2分钟运行一次。谢谢!这一切都要视情况而定,但在许多/大多数情况下,进程越少越好。如果未排序的数据对您有效,请关注@Steve以获取更新。祝您好运LH.我有一个更新..这是可行的,但是我的iptables改变了格式并添加了一个空格,但不是所有的时间..所以我把10美元改成了11美元,它起了作用,但是有些在10:(不管是在空间10还是空间11,是否仍有在DST=上键入的方法?如果您需要显示确切的日志条目,请告诉我。太棒了!非常感谢..就这样!有什么建议让我学习awk用法吗?例如,一本书或某种培训吗?再次感谢!我喜欢关于awk的原著,'awk编程语言'由Aho、Weinberrg和Kenninghan撰写(因此得名awk)。请尝试搜索价格合理的副本。Arnold D.Robbins的《gawk书》涵盖了gawk支持的所有新功能,这是一本必读的书。这本书不管用,但谢谢!它返回了整个iptable日志,而不仅仅是dst并将其剥离。@sectech:是的,我忘了在中打印$10
。您尝试过更新的c吗ode?HTH.@sectech:您可能想再试一次。我可以向您保证,
DST=
string将从字段10中删除。
awk '{for (i=9;i<13;i++) {
 if ($i ~ /^DST=/) { sub(/DST=/, "", $i); print $i}
 }
}' iptables.log | sort -u
awk '!a[$10]++ { sub(/DST=/,"",$10); print $10 }' file
awk '{split($10,a,"=");b[a[2]];next}END{for(i in b)print i}' iptables.log