String Bash:从字符串中提取可变长度的(百分比)个数

String Bash:从字符串中提取可变长度的(百分比)个数,string,bash,numbers,progress-bar,String,Bash,Numbers,Progress Bar,我想用bash脚本编写一个小进度条 要生成进度条,我必须从日志文件中提取进度 此类文件(此处为run.log)的内容如下所示: 完成2d的时间为15小时,完成率为42.5%,剩余时间为231856 我现在有兴趣把42.5%的人分离出来。现在的问题是,这个数字的长度和数字的位置都是可变的(例如,“完成时间”可能只包含一个数字,如23h或59min) 我试过了这个姿势 echo "$(tail -1 run.log | awk '{print $6}'| sed -e 's/[%]//g')" 短

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

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

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

完成2d的时间为15小时,完成率为42.5%,剩余时间为231856

我现在有兴趣把42.5%的人分离出来。现在的问题是,这个数字的长度和数字的位置都是可变的(例如,“完成时间”可能只包含一个数字,如23h或59min)

我试过了这个姿势

echo "$(tail -1 run.log | awk '{print $6}'| sed -e 's/[%]//g')"
短时间内无法完成,也无法通过符号完成

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 ""

谢谢你们的帮助,伙计们

您应该能够隔离文件中第一个
逗号(,)
之后的进度。例如,如果需要介于
%
之间的字符,可以从以下命令中提取%:

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.)
根据你的例子

grep -o '[^ ]*%'

你应该给你想要的。

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

cut -f1 -d'%' | cut -f2 -d',' | cut -f2 -d' '
第一次切割后:

第二次之后(注意空格):

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

42.5

真管用!伟大的您能简单地解释一下regexp吗?感谢anishsane给我做了这个关于perl风格regex的简短介绍!如果它起作用并解决了你的目的,请投票表决并接受答案:)这是一个很好的工作,看起来像一个简单和elegenat的方式!谢谢我在下面附上了最后的脚本。。。
 42.5
42.5