这不是家庭作业。我是 bash 新手,并试图从我们的日志记录中收集一些数据。
我正在从文件中读取行。所有的行看起来都是这样的:
[info] 1 - 12-04 15:33:37.542 : Finished createWalletRandom, total time 9898ms
我需要解析出毫秒(我将得到最小值、最大值、平均值)。我可以得到9898ms
,但我需要摆脱它ms
才能使数学发挥作用。
尝试下面的这一行,不会改变任何东西:
MILLI_SECONDS=${RAW_MILLI_SECONDS%??}
尝试下面的操作会产生错误get_wallet_times.sh: line 23: -2: substring expression < 0
:
MILLI_SECONDS=${RAW_MILLI_SECONDS::-2}
这是我的代码:
while read ONE_LINE;
do
echo $ONE_LINE
RAW_MILLI_SECONDS="$(cut -d' ' -f13 <<<"$ONE_LINE")"
echo $RAW_MILLI_SECONDS
MILLI_SECONDS=${RAW_MILLI_SECONDS::-2}
MILLI_SECONDS=${RAW_MILLI_SECONDS%??}
echo ${MILLI_SECONDS}
LINE_COUNT=$((LINE_COUNT+1))
FILE_SUM=$((FILE_SUM+MILLI_SECONDS))
done < logfile.txt
这是在 macOS 上,以防它是 mac 特有的 bash 问题。如果您还有其他需要,请告诉我。
谢谢马特
答案1
我不确定 的 MacOS 实现是否存在差异bash
,但您可以尝试基于 RegExp 的字符串修改,如下所示
MILLI_SECONDS=${RAW_MILLI_SECONDS/ms/}
ms
它将用空字符串替换模式。
答案2
您可以使用它awk
来解析整个文件
awk '
/ms$/ { ms += $NF }
END { printf "Total %ld ms from %d record(s)\n", ms, NR }
' <logfile.txt
第一行匹配ms
一行的最后两个字符,并对相应字段的数值求和。该END
行报告总数。