如何使用 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 ")

从输出来看,我的毫秒数确实是正确的。所以我不明白为什么我会收到这个错误(上面)。

一点额外的信息。我在 MacOS 上运行它,以防 bash 语法产生任何差异。

谢谢你的帮助。如果还有什么需要补充的,请告诉我。

编辑:

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

相关内容