はい、同様の質問がありましたが、その答えのどれも私がここで何を見逃しているのか教えてくれません。
私の問題は、私がコードで生成するものを完全に理解していないようです。
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
と、代わりにNULL文字が必要ですが、これまで\ nをNULL文字に置き換える方法が見つかりませんでした。私はそれを試し\0
ました\n\0
。最初は私の出力を1つの大きな行に接続します。 2番目のアイテムはまだ私が望む行ごとに1つの要素を提供しますが、数も1です。