これを行うより高速な方法を知っている人はいますか? これは現在、このスクリプトに 1 秒あたりの高い行数をプッシュすると遅くなります。
#!/bin/bash
declare -A clientarray
file=$1
timer=$2
e=$(date --date "now +$timer second" +%s)
while read line
do
if [ -n "${clientarray[$line]}" ]; then
let "clientarray[$line]=clientarray[$line]+1"
echo "$line: ${clientarray[$line]}"
elif [ -z "${clientarray[$line]}" ]; then
clientarray[$line]=1
echo "$line: ${clientarray[$line]}"
fi
if [ $(date +%s) -gt $e ]; then
e=$(date --date "now +$timer second" +%s)
fi
done < <(tail -F $file | gawk -F"]" '/]/ {print $1}')
次に、行の例を示します。
someline]
someline2]
somethingidontwant
someline3]
somethingelseidontwant
someline4]
そしてスクリプトを呼び出すには:
bash script.sh somelogfile.log 1
最後にifロジックをコメントアウトすると、非常に高速になりますが、速度が2/3低下します。pvでテストしました:
(これは if ロジックを使用したものです):
ubuntu@myhost:~/graphs$ tail -F somelogfile.log | pv -N RAW -lc >/dev/null |
> bash script.sh somelogfile.log 1 | pv -N SCP -lc >/dev/null
RAW: 2.18k 0:00:16 [ 493/s ] [ <=> ]
SCP: 593 0:00:16 [ 150/s ] [ <=> ]
(これはなしです)
ubuntu@myhost:~/graphs$ tail -F somelogfile.log | pv -N RAW -lc >/dev/null |
> bash script.sh somelogfile.log 1 | pv -N SCP -lc >/dev/null
RAW: 7.69k 0:00:15 [512/s] [ <=> ]
SCP: 7.6k 0:00:15 [503/s] [ <=> ]
スクリプトまたはテスト側で何か不足している場合、特に「DOH!」があれば教えてください。この時点で、私は1つが好きだと思います=)