Bash脚本需要for循环中的数组值

时间:2016-04-05 20:24:44

标签: bash

我有如下的数组值,并在下面用于循环。

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 

请帮我怎么做....

3 个答案:

答案 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 '$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