sed를 사용하여 특정 단어 뒤에 오는 문자열에서 값 추출

sed를 사용하여 특정 단어 뒤에 오는 문자열에서 값 추출

명령 출력에서 ​​특정 값만 추출하고 싶습니다.

이 명령으로 반환된 문자열은 다음과 같습니다.

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%

관련 정보