我知道有“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
,它本身定义了几个排序函数。
这通常uniq
是awk
通过将“唯一数据元素或键”保存在关联数组中并检查是否需要记住新数据来完成的。举一个例子来说明:
awk '!a[$0]++'
这意味着:如果当前行不在数组中,则条件为 true,并触发打印该行的默认操作。具有相同数据的后续行将导致错误条件,并且不会打印数据。
答案2
如果您使用双引号,它对我有用
打印 substr(a[1],1,5) | "sort -u" # 唯一值