【问题标题】:Complex sorting in shell scriptshell脚本中的复杂排序
【发布时间】:2021-02-17 07:06:50
【问题描述】:

我编写了一个满足提取要求的脚本,但我无法根据格式要求对结果进行排序。这是我的脚本:

awk '{print $9"  "$1}' ab.log | sort | uniq -c | awk '{print $2 "\t" $3}' | sort -nr

按降序显示状态码和IP地址;

404   89.86.144.219
404   81.192.148.245
.
.
403   172.6.0.3
403   129.16.26.39
402   145.8.0.9
402   256.23.4.57
.
.
401   126.158.20.9

但要求是: 状态代码组必须按哪个状态代码组出现频率更高进行排序,并且 IP 地址必须按每个组中出现的次数进行排序。

所以输出应该是:

404    127.0.0.1
404    xxx.xxx.xxx.xxx
.
.
200    xxx.xxx.xxx.xxx
200    xxx.xxx.xxx.xxx
.
.
403    xxx.xxx.xxx.xxx
403    xxx.xxx.xxx.xxx

如何按照上述要求对结果进行排序?

【问题讨论】:

  • 请发布一些用于测试的示例数据以符合预期的输出。

标签: bash shell unix


【解决方案1】:

可能有一个惊人的命令可以用于此。然而,这是一个使用 awk、sort 和 cut 的管道:

$ awk '{a[$1]++;b[$0]=$1}END{for(i in b) printf "%-9d%s\n",a[b[i]],i}' | sort -k1,1nr -k2,2n -k3,3 | cut -c9-

使用 GNU awk,您甚至可以将其变成一个命令,但它只会开始显得凌乱

【讨论】:

  • 感谢您的回复,我先尝试了,但它不起作用
  • 我们可以在没有“awk”的情况下做到这一点吗?
  • @zeetest8428 你不喜欢 awk?
  • 要求是在没有 "awk" 的情况下执行此操作。我们只能使用“awk”进行格式化
猜你喜欢
  • 1970-01-01
  • 2012-03-19
  • 1970-01-01
  • 2014-06-10
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
相关资源
最近更新 更多