ログファイルを分析しています。私の目標は、それから平均、最短、最長時間を収集することです。
各行のミリ秒を分析できます。数学しようとするとエラーが発生します。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 ...)