コマンド出力から特定の値だけを抽出したいです。
このコマンドで返される文字列は次のとおりです。
Result: " 5 Secs (11.2345%) 60 Secs (22.3456%) 300 Secs (33.4567%)"
filter()の間には「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
grep
代わりにGNUを使用できます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
また、\K
試合開始時間をリセットすることもできます。
$ echo "$result" | grep -Po '60 Secs \(\K[^)]*'
22.3456%