如何使用bash shell脚本运行100次迭代? 我想知道执行一个命令需要多长时间(开始和结束时间)。 我想跟踪当前正在运行的迭代。 我想记录每个迭代。 我有一个自动化脚本,需要运行和记录它。
for i in 1 2 3
do
command1
done
但是我想知道完成一次迭代需要多长时间-并将信息也写入日志文件!
另请参阅stackoverflow.com/questions/3737740/
您也可以在迭代中使用seq:
for i in `seq 1 100`; do ... done
for ((i = 1; i <= 100; i++)); do
echo"--- Iteration #$i: $(date) ---"
time command1
done 2>&1 | tee timing.log
这里有很多事情。发生了什么?
for循环使用C样式语法从1迭代到100。
回显打印输出中的$i打印当前迭代编号。
$(date)在每个打印输出中插入一个时间戳。
time命令运行命令并打印执行所花费的时间。
循环内部所有内容的输出都通过管道传输到tee,这会将副本保存到timing.log。
2>&1将stderr重定向到stdout,以便日志文件将包含常规输出和错误消息。
以下脚本显示了一种实现方法。
#!/usr/bin/bash
for i in {1..100} ; do
echo =============================
echo"Number $i: $(date +%Y-%m-%d-%H:%M:%S)"
( time ( echo $i ; sleep 1 ) ) 2>&1 | sed 's/^/ /'
done | tee timing.log
它使用bash范围功能运行循环100次迭代,输出循环计数器和日期。
然后对命令(在这种情况下为echo $i ; sleep 1)进行计时,并结合标准输出和错误,然后再对其进行格式化,然后将其发送到终端和日志文件中,以供以后分析。
smaple运行五次迭代:
pax> testprog.sh
=============================
Number 1: 2010-09-16-13:44:19
1
real 0m1.063s
user 0m0.077s
sys 0m0.015s
=============================
Number 2: 2010-09-16-13:44:20
2
real 0m1.056s
user 0m0.030s
sys 0m0.046s
=============================
Number 3: 2010-09-16-13:44:21
3
real 0m1.057s
user 0m0.046s
sys 0m0.030s
=============================
Number 4: 2010-09-16-13:44:22
4
real 0m1.057s
user 0m0.061s
sys 0m0.031s
=============================
Number 5: 2010-09-16-13:44:23
5
real 0m1.057s
user 0m0.046s
sys 0m0.015s
您可以尝试:
for i in {1..100}; do time some_script.sh; done 2>&1 | grep ^real | sed -e s/.*m// | awk '{sum += $1} END {print sum / NR}'
说明
for循环运行some_script.sh 100次,并使用time测量其执行时间
for循环的stderr重定向到stdout,这是为了捕获time的输出,因此我们可以对其进行grep
grep ^real将仅获得time输出中以" real"开头的行
sed是删除行的开始,直到分钟部分(在time的输出中)
对于每行,awk加上总和,以便最后可以输出平均值,即总和除以输入记录数(= NR)
局限性
该代码段假定some_script.sh的运行时间少于1分钟,否则它将根本无法工作。取决于您的系统,time内置函数可能会有所不同。另一种选择是使用时间命令/ usr / bin / time代替内置的bash。
注意:此脚本是从此处提取的。
我想对组合实验计时,说说运行some_script.sh 10次时的总运行时间。 不知道这是否是正确的,但是如果按照您的方式做,我会执行不准确的time实验10次,因为每次some_script.sh完成得都太早了。
这部分:awk {sum += $1} END {print sum NR}将所有运行的总时间相加,然后除以执行时间。 因此,它将计算所有运行的平均值。
该脚本基于@ marian0的答案,但运行时间没有限制。将其命名为timeit.sh,然后执行./timeit.sh 10 ./script以运行./script 10次并打印平均时间。可以根据需要添加其他参数。
#!/bin/bash
for i in `seq 1 $1`; do
time"${@:2}"
done 2>&1 |\
grep ^real |\
sed -r -e"s/.*real\t([[:digit:]]+)m([[:digit:]]+\.[[:digit:]]+)s/\1 \2/" |\
awk '{sum += $1 * 60 + $2} END {print sum / NR}'