我只想从命令输出中提取特定值。
该命令返回的字符串是这样的:
Result: " 5 Secs (11.2345%) 60 Secs (22.3456%) 300 Secs (33.4567%)"
我只想过滤 () 之间的“60 秒”值
22.3456%
我怎样才能做到这一点?
答案1
如果这正是命令返回的字符串,那么sed
就可以工作。
command_output | sed 's/.*60 Secs..\(.*\)..300.*/\1/'
这将打印60 Secs (
和之间的所有内容) 300
。
结果:
22.3456%
答案2
你可以这样做sed
,是的。只需搜索60 Secs (
,然后搜索-%
尽可能多的非字符,直到第一个%
:
$ echo "5 Secs (11.2345%) 60 Secs (22.3456%) 300 Secs (33.4567%)" |
sed 's/.* 60 Secs (\([^%]*%\).*/\1/'
22.3456%
或者,在 Perl 中:
$ echo "5 Secs (11.2345%) 60 Secs (22.3456%) 300 Secs (33.4567%)" |
perl -lne '/.* 60 Secs \(([^%]*%)/; print "$1"'
22.3456%
或者,如果格式是标准的并且您知道您始终需要第 6 个字段,则可以执行以下操作:
$ echo "5 Secs (11.2345%) 60 Secs (22.3456%) 300 Secs (33.4567%)" |
awk '{gsub(/[()]/,""); print $6}'
22.3456%
或者:
$ echo "5 Secs (11.2345%) 60 Secs (22.3456%) 300 Secs (33.4567%)" |
cut -d' ' -f6 | tr -d '()'
22.3456%
答案3
您可以使用 GNUgrep
代替sed
:
$ foo='Result: "5 Secs (11.2345%) 60 Secs (22.3456%) 300 Secs (33.4567%)"'
$ echo "$foo" | grep -Po "(?<= 60 Secs \()[0-9\.%]*"
22.3456%
与sed
:
$ echo "$foo" | sed 's/^.* 60 Secs (\([0-9\.%]*\).*$/\1/'
22.3456%
这两个命令都捕获0-9.%
“60 秒”后包含字符的字符串(“.
和awk
:
$ echo "$foo" | awk -F'[() ]' '{ print $10 }'
22.3456%
答案4
您还可以使用grep -P
's\K
重置比赛开始时间:
$ echo "$result" | grep -Po '60 Secs \(\K[^)]*'
22.3456%