如何使用bash shell脚本运行100次迭代?我想知道执行一个命令需要多长时间(开始和结束时间)。我想跟踪当前正在运行的迭代。我想记录每次迭代。我有一个自动脚本我需要运行并记录它。
for i in 1 2 3
do
command1
done
但我想知道完成一次迭代需要多长时间 - 并将信息写入日志文件中!
答案 0 :(得分:19)
您也可以在迭代中使用seq
:
for i in `seq 1 100`; do ... done
答案 1 :(得分:10)
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,以便日志文件包含常规输出和错误消息。答案 2 :(得分:7)
以下脚本显示了一种方法。
#!/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
)并将标准输出和错误组合在一起,然后将其格式化,然后将其发送到终端和日志文件以供以后分析。
五次迭代:
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
答案 3 :(得分:4)
您可以尝试:
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}'
time
time
的输出所以我们可以grep它grep ^real
只能获得以&#34;真实&#34;开头的行。在time
sed
将删除行的开头至分钟部分(在time
的输出中)awk
添加总和,以便最终输出平均值,即总和,除以输入记录的数量(= NR
)< / LI>
该片段假定some_script.sh的运行时间小于1分钟,否则它根本不起作用。根据您的系统,time
内置版可能会有不同的工作方式。另一种方法是使用time命令/ usr / bin / time而不是bash builtin。
注意:此脚本摘自here。
答案 4 :(得分:1)
该脚本基于the answer from @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}'