로그 파일을 분석 중입니다. 내 목표는 그것으로부터 평균, 최단, 최장 시간을 수집하는 것이다.
각 줄의 밀리초를 분석할 수 있습니다. 수학을 시도하면 오류가 발생합니다.17607 + 0 : syntax error: invalid arithmetic operator (error token is " + 0 ")
파일의 행은 다음과 같습니다.
./test_1_iws_1.txt:[info] 1 - 12-05 22:18:13.436 : Finished createWalletRandom, total time 17607ms
./test_1_iws_1.txt:[info] 1 - 12-05 22:18:19.504 : Finished createWalletRandom, total time 21978ms
./test_1_iws_1.txt:[info] 1 - 12-05 22:18:23.419 : Finished createWalletRandom, total time 25815ms
내 코드는 다음과 같습니다
#!/usr/bin/env bash
LINE_COUNT=0
FILE_SLOWEST=1
FILE_LONGEST=1
FILE_SUM=0
while read ONE_LINE;
do
RAW_MILLI_SECONDS="$(cut -d' ' -f13 <<<"$ONE_LINE")"
echo "raw = |${RAW_MILLI_SECONDS}|"
MILLI_SECONDS=${RAW_MILLI_SECONDS/ms/}
LINE_COUNT=$(( LINE_COUNT + 1 ))
echo "finished value = .${MILLI_SECONDS}."
echo "line count = ${LINE_COUNT}"
FILE_SUM=$(( $MILLI_SECONDS + $FILE_SUM ))
done < logfile.txt
출력은 다음과 같습니다:
raw = |17607ms|
finished value = .17607.
line count = 1
get_wallet_times.sh: line 14: 17607 + 0 : syntax error: invalid arithmetic operator (error token is " + 0 ")
출력 결과에 따르면 내 밀리초가 실제로 정확합니다. 그래서 저는 왜 이 오류(위)가 발생하는지 이해할 수 없습니다.
약간의 추가 정보. Bash 구문에 차이가 있을 경우를 대비하여 MacOS에서 이것을 실행하고 있습니다.
도움을 주셔서 감사합니다. 그 밖에 추가해야 할 사항이 있으면 알려주시기 바랍니다.
편집하다:
head -1 logfile.txt | od -c
0000000 . / t e s t _ 1 _ i w s _ 1 . t
0000020 x t : [ 033 [ 3 2 m i n f o 033 [ 3
0000040 9 m ] 1 - 1 2 - 0 5
0000060 2 2 : 1 8 : 1 3 . 4 3 6 : \t
0000100 033 [ 3 2 m F i n i s h e d c r
0000120 e a t e W a l l e t R a n d o m
0000140 , t o t a l t i m e 1 7 6
0000160 0 7 m s 033 [ 3 9 m \n
0000172
답변1
몇 가지 특수 문자 문제를 해결하지 않고도
awk는 전체 파일을 더 빠르게 처리할 수 있습니다.
#!/bin/bash
LINE_COUNT=0
FILE_SLOWEST=1
FILE_LONGEST=1
awk '{ val=$NF+0;
if(NR==1) {min=val;max=val}
if(max<val){max=val}
if(min>val){min=val}
sum+=val
} END {
avg=sum/NR
print(sum,avg,max,min)
}' logfile.txt | {
read SUM AVG MAX MIN
echo "The Sum of values is = $SUM"
echo "The averaged value of times is = $AVG"
echo "The maximum of times is = $MAX"
echo "The minimum of times is = $MIN"
}
read
파이프라인이 끝난 후에도 값을 유지 하려면 다음과 같은 것이 필요하다는 점을 이해하십시오 .
read SUM AVG MAX MIN < <(awk ...)