任何人都知道更好的方法来做到这一点,它是更快?日期为什么这么慢?
#!/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