Bash를 사용하여 잘못된 산술 연산자를 수정하는 방법은 무엇입니까?

Bash를 사용하여 잘못된 산술 연산자를 수정하는 방법은 무엇입니까?

로그 파일을 분석 중입니다. 내 목표는 그것으로부터 평균, 최단, 최장 시간을 수집하는 것이다.

각 줄의 밀리초를 분석할 수 있습니다. 수학을 시도하면 오류가 발생합니다.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 ...)

관련 정보