답변:
이 방법으로 시도하십시오 :
y=$(echo $x | awk '{print $2}')
echo $y
echo $x
의 값을 표시합니다 x
.awk '{print $2}'
이전에 표시된 두 번째 필드를 인쇄합니다 x
.$(
... )
출력을 잡고에 할당하십시오 y
.echo $x
되고 하지 의 값을 표시x
. printf '%s\n' "$x"
될 것입니다.
awk '{print $2}'
이전에 표시된 각 줄 의 두 번째 필드 를 인쇄합니다 x
.
추출하려는 부분 문자열 앞에 공백이 하나 이상 있고 부분 문자열에 공백이 없다고 가정하면 간단한 매개 변수 확장으로이를 수행 할 수 있습니다.
x="rtcpOnNbActive true"
y="${x##* }"
echo "[$y]"
산출
[true]
echo
로 시작 -
하지 않고 이스케이프 시퀀스를 포함 하지 않는 리터럴 문자열 이외의 것은 이식성이 없습니다 . bash 내장의 경우에도 컴파일 방법 및 XPG_ECHO
설정 여부에 따라 동작이 다릅니다 . 문자열에 이스케이프 시퀀스가 없다고 가정하면 문제가 없지만 printf '[%s]\n' "$y"
여전히 좋습니다.
echo
이와 같은 "throw-away"예에서도 변수의 가치를 표시하는 데 사용 하는 습관을 깨뜨려야 합니다.
당신은 awk를 사용할 수 있습니다 :
echo "rtcpOnNbActive true" | awk '{print $NF}'
true
NF
현재 레코드의 필드 수
sed를 사용하여 :
echo "rtcpOnNbActive true" | sed 's/.* //g'
true
문자열 표현식 사용 :
a="rtcpOnNbActive true"
echo ${a##* }
true
grep을 사용하여 :
echo "rtcpOnNbActive true" | grep -Eo "[a-z]+$"
true
-o는 정확히 일치 [a-z]+
만하며 az의 문자와 일치 $
하며 끝을 의미합니다.
echo
로 시작 -
하지 않고 이스케이프 시퀀스를 포함 하지 않는 리터럴 문자열 이외의 것은 이식성이 없습니다 . bash 내장의 경우에도 컴파일 방법 및 XPG_ECHO
설정 여부에 따라 동작이 다릅니다 . 또한 변수 확장 및 명령 대체를 항상 큰 따옴표로 묶어야합니다 (필요하지 않지만 해를 끼치 지 않는 특정 예외는 제외). OP와 같은 문자열을 사용하면 괜찮을지 모르지만 확인 printf '%s\n' "${a##* }"
하려는 경우 더 좋습니다.
당신은 read
내장을 사용할 수 있습니다
read -r _ y <<<"$x"
printf "%s\n" "$y"
true
read
있습니까? 그것은 read
분할을하지 않습니다 -그것은입니다 $IFS
. 어떤 이유로 많은 사람들 이 관여 할 $IFS
때만 분리하는 read
것이 좋습니다. 당신은 할 수 있습니다 : set -f; IFS=' '; printf %.0s%s $x
또는 무엇이든. 어쨌든- $IFS
여기에 값 을 지정해야합니다 .
read
할당, $IFS
분할. 배열을 채우려면 사용 set
하십시오.이 경우 인공 here-string 넌센스가 필요하지 않습니다. unset IFS
기본 $ IFS 동작을 얻습니다.
x
추출하려는 부분 문자열 바로 앞에 항상 공백이 있습니까?