使用 sed 从特定单词后面的字符串中提取值

使用 sed 从特定单词后面的字符串中提取值

我只想从命令输出中提取特定值。

该命令返回的字符串是这样的:

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%

相关内容