我需要输出一段时间内 grep 结果的总和,现在我硬编码了 grep 时间,但任何帮助将非常感激,我的问题是我无法在脚本上输出结果。
如果我使用这一行,它会给我输出 1:
cat *.log | egrep '2011-07-01 (04:[0][0-9]:[0-5][1-9]|04:10:00)' * | grep -ach '0110 478655 .. 51' | awk '{SUM += $1} END { print SUM }'
这行会给我输出 0 :
cat *.log | egrep '2011-07-01 (04:[1][0-4]:[0-5][1-9]|04:15:00)' * | grep -ach '0110 478655 .. 51' | awk '{SUM += $1} END { print SUM }'
这段代码需要很多改进:
while read line
do
cd $DIR
ta1=`cat *.log | egrep '2011-07-01 (04:[0][0-9]:[0-5][1-9]|04:10:00)' * | grep -ach '0110 478655 .. 51' | awk '{SUM += $1} END { print SUM }'`
ta2=`cat *.log | egrep '2011-07-01 (04:[1][0-4]:[0-5][1-9]|04:15:00)' * | grep -ach '0110 478655 .. 51' | awk '{SUM += $1} END { print SUM }'`
ta=$((ta1 + ta2))
echo -e "Results = $ta "
done
我想添加结果并将其放在 while do 语句中,我还需要两次 grep,以便我可以总结 15 分钟周期的所有实例。,知道如何改为执行单个 grep 语句吗?
答案1
如果您的问题只是让 grep 使用一个正则表达式而不是两个正则表达式匹配 15 分钟的窗口,请尝试像这样分解它:
改变:
egrep '2011-07-01 (04:[0][0-9]:[0-5][1-9]|04:10:00)'
egrep '2011-07-01 (04:[1][0-4]:[0-5][1-9]|04:15:00)'
到:
egrep '2011-07-01 04:(0[0-9]|1[0-4]):[0-5][0-9]'
这应该与从 00:00 开始到 14:59 结束的 15 分钟块匹配。对于接下来的三个块,使用这些:
# 15:00 to 29:59
egrep '2011-07-01 04:(1[5-9]|2[0-9]):[0-5][0-9]'
# 30:00 to 44:59
egrep '2011-07-01 04:(3[0-9]|4[0-4]):[0-5][0-9]'
# 45:00 to 59:59
egrep '2011-07-01 04:(4[5-9]|5[0-9]):[0-5][0-9]'