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

Tra*_*tti 5 sed filter

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

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

Result: " 5 Secs (11.2345%) 60 Secs (22.3456%) 300 Secs (33.4567%)"
Run Code Online (Sandbox Code Playgroud)

我只想过滤 () 之间的“60 秒”值

22.3456%
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Nas*_*ley 6

如果这是命令返回的确切字符串,sed则将起作用。

command_output | sed 's/.*60 Secs..\(.*\)..300.*/\1/'
Run Code Online (Sandbox Code Playgroud)

这会打印60 Secs (和之间的所有内容) 300

结果:

22.3456%
Run Code Online (Sandbox Code Playgroud)


ter*_*don 5

你可以在sed,是的。只需搜索60 Secs (然后尽可能多的非-%字符,直到第一个%

$ echo "5 Secs (11.2345%) 60 Secs (22.3456%) 300 Secs (33.4567%)" | 
    sed 's/.* 60 Secs (\([^%]*%\).*/\1/'
22.3456%
Run Code Online (Sandbox Code Playgroud)

或者,在 perl 中:

$ echo "5 Secs (11.2345%) 60 Secs (22.3456%) 300 Secs (33.4567%)" | 
    perl -lne '/.* 60 Secs \(([^%]*%)/; print "$1"'
22.3456%
Run Code Online (Sandbox Code Playgroud)

或者,如果格式是标准的并且您知道您总是想要第 6 个字段,您可以执行以下操作:

$ echo "5 Secs (11.2345%) 60 Secs (22.3456%) 300 Secs (33.4567%)" | 
    awk '{gsub(/[()]/,""); print $6}'
22.3456%
Run Code Online (Sandbox Code Playgroud)

或者:

$ echo "5 Secs (11.2345%) 60 Secs (22.3456%) 300 Secs (33.4567%)" | 
    cut -d' ' -f6 | tr -d '()'
22.3456%
Run Code Online (Sandbox Code Playgroud)