任何人都知道更好的方法來做到這一點,它是更快?日期爲什麼這麼慢?
#!/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/3rds。與光伏測試它:
(這是與如果邏輯):
[email protected]:~/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 ] [ <=> ]
(這是不)
[email protected]:~/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!」的。 我認爲在這一點上,我會很喜歡=)
您正在閱讀'$ line',但未在顯示的代碼中使用它。這是否將代碼剝離到最低限度的再現?同樣,除非定期更新,否則您不會使用'$ e'做任何事情。在每次迭代中必須運行外部命令('date')的事實總是會使得進程比只有內部命令執行時慢。最終,你可能會更好地使用Python或Perl或類似的東西;它可以避免新的流程開銷,同時更簡單地進行日期計算。 – 2012-04-26 18:46:59
修復了這個問題,對不起,我通常使用我來代替行,我只是放了行,因爲這是讀取時使用的常見示例,並且錯過了更改腳本的主體。 – patch 2012-04-27 14:01:37
練習編寫代碼是一個不錯的主意,因此您不需要在公開發布代碼之前對其進行修改。那麼你不會遇到這樣的問題。 – 2012-04-27 14:26:12