Bash 基于awk添加列结果

Bash 基于awk添加列结果,bash,awk,Bash,Awk,我正在尝试汇总此查询的结果,该查询从access.log获取HTTP错误代码,并列出每个代码的总出现次数: awk '{print $9}' access.log | sort | uniq -c | sort -rn 结果: 234 200 3 500 102 404 26 304 3 404 试图找出总结结果的最佳方法(第1列=234+3+102+26+3) 谢谢。将其导入另一个awk命令,该命令将打印行并计算总数 awk '{print $9}' access.log | sor

我正在尝试汇总此查询的结果,该查询从access.log获取HTTP错误代码,并列出每个代码的总出现次数:

awk '{print $9}' access.log | sort | uniq -c | sort -rn 
结果:

234 200
3   500
102 404
26 304
3 404
试图找出总结结果的最佳方法(第1列=234+3+102+26+3)


谢谢。

将其导入另一个
awk
命令,该命令将打印行并计算总数

awk '{print $9}' access.log | sort | uniq -c | sort -rn | awk '{total += $1; print} END {print total, "Total"}'

您可以使用单个awk解决方案实现这一点,无需使用任何管道进行排序或uniq。使用GNU awk:

awk '$9 ~ /[[:digit:]]{3}/ { err[$9]+=1 } END { PROCINFO["sorted_in"]="@val_num_asc";for (i in err) { tot=tot+err[i];print i" - "err[i]} printf "\nTOT - %s\n",tot }' access.log

首先,我们检查第9个空格分隔的字段是否为HTTP代码的正确格式(3位)。如果是这种情况,我们将设置一个名为err的数组,并将代码作为索引,每次遇到代码时,该索引都会递增。处理完所有行后,我们按值、数字、升序对数组进行排序,然后循环遍历条目,打印代码和总数。我们还在变量tot中设置一个运行总数。我们最终在输出的末尾打印了这个tot。

这不是我期望从该命令得到的结果,它没有被排序。总和只是
wc-l访问。log
GNU datamash对于这类事情很方便:
datamash-Ws-g9 count 9
。和
wc-l access.log
合计?如果您可以发布输入样本,那么我们可能也可以在一个awk中完成。谢谢,这很有效!没问题。如果您对解决方案感到满意,请将其作为公认的答案接受