是的,有人问过类似的问题,但这些答案都没有告诉我我在这里缺少什么。
我认为我的问题是没有完全理解我用代码生成的内容......
LOGFILE=$1
ERROR=$2
START_TIME=$3
END_TIME=$4
FILEDATE=$(echo "${NOW//-}")
FINDSTR='10\.22\.*'
GREP=/bin/zgrep
for (( HOUR=START_TIME ; HOUR <= END_TIME ; HOUR++ )); do
DATE=$(printf "$NOW %02d" $HOUR )
echo
printf "%02d:00\n" $HOUR
ERRORSTORES=$($GREP "$ERROR" $( find /opt/logs/ -name $LOGFILE-$FILEDATE* |
grep $FINDSTR ) | grep "$DATE" | awk -F ' ' '{ print $4 }' |
awk '{a[$0]++}END{for(i in a){printf ("%s\t%d\n", i, a[i])}}')
printf "Stores showing \"%s\": %d\n" "$ERROR" "${#ERRORSTORES[*]}"
printf '%s\n' "${ERRORSTORES[@]}"
done
为了这篇文章的目的,我尝试简化代码。我已经用简单的 VAR=$n 赋值替换了大量获取命令行输入的工作代码
我的问题出在线路上
`printf "Stores showing \"%s\": %d\n" "$ERROR" "${#ERRORSTORES[@]}"`
从我在其他网站上找到她的所有内容来看,"${#array[@]}"
应该可以给我数组中元素的计数。但"${#ERRORSTORES[@]}"
总是打印1或0!
我现在怀疑我正在撰写这个问题,我的问题出在行尾的 awk 过滤器的 printf 中ERRORSTORES=$(...)
。我猜测以 \n 结尾的 printf 给出了我想要的输出(换行符上的每个元素)但混淆了模式"${#array[@]}"
。
据我了解,我需要一个空字符而不是,\n
但到目前为止我还没有想出用空字符替换 \n 的方法。我已经尝试过了\0
并且\n\0
。第一个将我的输出串在一条大线上。第二个仍然为我提供了我想要的每行一个元素,但也给出了 1 的计数。