
예, 비슷한 질문이 제기되었지만 그 답변 중 어느 것도 내가 여기서 무엇을 놓치고 있는지 말해주지 않습니다.
내 문제는 내가 코드로 생성하는 내용을 완전히 이해하지 못하는 것 같습니다.
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입니다.