我想从wget
命令输出的最后一位解析3条信息,例如:
2022-12-26 19:14:44 (13.7 Mb/s) - ‘somelibrary.min.js’ saved [1077022]
我能够得到日期/时间,因为这是一个固定的长度。我无法提取est.传输速度(13/7
)和文件大小(1077022
)的值。
STR="2022-12-26 19:14:44 (13.7 Mb/s) - ‘somelibrary.min.js’ saved [1077022]"
echo date/time is ${STR::19}
我想剩下的子字符串提取需要借助正则表达式来完成,但我无法找到它。是否有一条仅使用 *nix utils(如awk、sed等)的可行路径?
我试过awk:
echo "(13.7 Mb/s)" | awk '$0 ~ /(.* Mb\/s)/ {print $1}'
但是我得到的是(13.7
而不仅仅是数字。
5条答案
按热度按时间zphenhs41#
您可以使用bash的正则表达式匹配来实现这一点,在RE中使用
( )
来捕获相关部分,然后使用${BASH_REMATCH[n]}
来获取它们:顺便说一句,我建议使用小写或混合大小写的变量名,以避免与具有特殊函数的许多全大写名称冲突,并通过shellcheck.net运行脚本以查找常见错误。
f2uvfpb92#
这个
awk
应该适合您:-F '[][()[:blank:]]+'
将[
或]
或(
或)
的1+或空白设置为输入字段分隔符0mkxixxg3#
使用你展示的示例,请尝试以下
awk
代码。在GNUawk
中编写和测试。这里是Online Demo用于使用正则表达式。rhfm7lfc4#
使用Perl和 * 命名捕获组 *:
输出
解释
参见regex101 description
ctehm74n5#
在更换中使用
sed
和3个捕获组\1
、\2
和\3
:模式匹配:
([^()]+)
捕获组1,匹配除()
以外的任何字符\(([^()]*)\)
在(...)
之间捕获除组2中的(
和)
之外的任何字符.*
与行的其余部分匹配\[([^][]*)]
在[...]
之间捕获组3中除[
和]
之外的任何字符在regex101上查看此处的捕获组值
产出