명령 출력에서 특정 값만 추출하고 싶습니다.
이 명령으로 반환된 문자열은 다음과 같습니다.
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
's를 사용하여 \K
경기 시작 시간을 재설정 할 수도 있습니다 :
$ echo "$result" | grep -Po '60 Secs \(\K[^)]*'
22.3456%