我有如下的数组值,并在下面用于循环。
a=(400 402 403 404)
for i in "${a[@]}"
do
echo $i;
done
输出
400
402
403
404
我需要逐个获取数组值并使用如下。
for i in "${a[@]}"
do
awk '{if($8==$i) print} filename.log | wc -l;
done
我需要在httpderror.log中找到错误计数,所以我逐个传递http错误代码来检查每个http代码中找到的文件和打印错误计数。第8列中发现了Http错误($ 8 == $ i)。
输出应该是匹配线的错误计数,如400 - 44,402 -43,但只需要如下的值..
44
43
42
请帮我怎么做....
答案 0 :(得分:5)
你可以这样做:
for i in "${a[@]}"
do
awk -v code="$i" '$8==code{c++} END{print code, "-", c}' filename.log
done
但是我建议直接在awk中使用避免为数组中的每个元素调用awk命令。
awk 'BEGIN {
a[400]=a[402]=a[403]=a[404]=0
}
$8 in a {
a[$8]++
}
END {
for (i in a)
print i, "-", a[i]
}' filename.log
答案 1 :(得分:1)
在两种不同的脚本语言之间混合数据结构 要求麻烦。
根据原始问题,您需要400,402,403的完全匹配,以及第8列中的404。
使用正则表达式,您可以仅在awk中执行此操作。
awk '$8 ~ /^40[0234]$/ {n++} END {print n}' filename.log
较短的版本是:
awk '$8 ~ /^40[0234]$/' filename.log | wc -l
(但是awk也可以进行计数)。
答案 2 :(得分:1)
试试这个:
for i in "${a[@]}"
do
awk '{print $8}' filename.log | grep $i | wc -l
done