awk 中的排序和 uniq

awk 中的排序和 uniq

我知道有“sort”和“uniq”,但是,今天的问题是如何利用 AWK 来完成此类工作。假设我有一个真实的列表(ip、名称或数字)并且我想对它们进行排序;

下面是我从邮件日志中获取 IP 号码的示例:

awk 'match($0,/\[[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\]/) { if ( NF == 8 && $6 == "connect" ) {print substr($0, RSTART+1,RLENGTH-2)} }' maillog

是否可以在同一个 awk 命令中“随时随地”对它们 ips 进行排序?我不需要我的问题的完整答案,但需要一些从哪里开始的提示。

干杯!

答案1

要排序,您也可以在命令内部使用管道awk,如下所示:

awk '{ print ... | "sort ..." }'

该语法意味着数据文件的所有相应行都将传递到同一个排序实例。

当然,您也可以在 shell 级别上等效地执行此操作:

awk '{ print ... }' | sort ...

或者您可以使用 GNU awk,它本身定义了几个排序函数。

这通常uniqawk通过将“唯一数据元素或键”保存在关联数组中并检查是否需要记住新数据来完成的。举一个例子来说明:

awk '!a[$0]++'

这意味着:如果当前行不在数组中,则条件为 true,并触发打印该行的默认操作。具有相同数据的后续行将导致错误条件,并且不会打印数据。

答案2

如果您使用双引号,它对我有用

打印 substr(a[1],1,5) | "sort -u" # 唯一值

相关内容