我正在解析一个日志文件。我的目标是从中收集平均、最短、最长时间。
我能够解析每行的毫秒数。当我尝试对其进行数学计算时,出现错误: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 ...)