5

我想使用 bash 脚本编写一个小进度条。

要生成进度条,我必须从日志文件中提取进度。

此类文件(此处为 run.log)的内容如下所示:

2d 15h 完成时间,完成 42.5%,剩余时间步长 231856

我现在有兴趣隔离 42.5%。现在的问题是这个数字的长度以及数字的位置是可变的(例如,“完成时间”可能只包含一个数字,如 23 小时或 59 分钟)。

我在这个位置上试过了

echo "$(tail -1 run.log | awk '{print $6}'| sed -e 's/[%]//g')"

它在短的“完成时间”以及通过 %-sign 失败

echo "$(tail -1 run.log | egrep -o '[0-9][0-9].[0-9]%')"

这里仅适用于 >= 10% 的数字。

有更多可变数字提取的解决方案吗?

==================================================== ====

更新:现在是进度条的完整脚本:

#!/bin/bash

# extract % complete from run.log
perc="$(tail -1 run.log | grep -o '[^ ]*%')"

# convert perc to int
pint="${perc/.*}"

# number of # to plot
nums="$(echo "$pint /2" | bc)"

# output
echo -e ""
echo -e "   completed: $perc"
echo -ne "   "
for i in $(seq $nums); do echo -n '#'; done
echo -e ""
echo -e "  |----.----|----.----|----.----|----.----|----.----|"
echo -e "  0%       20%       40%       60%       80%       100%"
echo -e ""
tail -1 run.log
echo -e ""

谢谢你们的帮助,伙计们!

4

4 回答 4

4

根据你的例子

grep -o '[^ ]*%'

应该给你想要的。

于 2013-01-30T13:34:46.230 回答
1

您可以从以下命令中提取 %:

tail -n 1 run.log | grep -o -P '[0-9]*(\.[0-9]*)?(?=%)'

解释:

grep options:
-o : Print only matching string.
-P : Use perl style regex

regex parts:
[0-9]* : Match any number, repeated any number of times.
(\.[0-9]*)? : Match decimal point, followed by any number of digits. 
              ? at the end of it => optional. (this is to take care of numbers without fraction part.)
(?=%)  :The regex before this must be followed by a % sign. (search for "positive look-ahead" for more details.)
于 2013-01-30T13:29:43.790 回答
0

您应该能够comma (,)在文件中的第一个之后隔离进度。即。你想要和之间的,字符%

于 2013-01-30T13:28:50.993 回答
0

有很多方法可以实现你的目标。我宁愿多次使用cut ,因为它易于阅读。

cut -f1 -d'%' | cut -f2 -d',' | cut -f2 -d' '

第一次切割后:

 Time to finish 2d 15h, 42.5

秒后(注意空格):

 42.5

最后一个只是为了摆脱空间,最终结果:

42.5
于 2013-01-30T13:35:18.403 回答