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 ...)

関連情報