여러 단어가 포함된 변수의 전체 내용을 인쇄하는 방법은 무엇입니까?

여러 단어가 포함된 변수의 전체 내용을 인쇄하는 방법은 무엇입니까?

여러 단어가 포함된 속성이 있습니다.

예:

0x1230ac1="Brown Fox is Near"

다음과 같이 CLI 인터페이스를 사용하여 명령을 입력하여 속성의 내용을 가져올 수 있습니다.

show attr=0x1230ac1

이 "show" 명령의 출력은 다음과 같습니다.

ID            Name                  Value
0x1230ac1     User_Attribute1       Brown Fox is Near

Bash 스크립트에서 동일한 "show" 명령을 사용하면 다음과 같이 할 수 있습니다.

show attr=0x1230ac1 | sed 1d | awk '{print $1,$3,$4,$5,$6}'

값 열의 문자열 길이가 2단어 또는 20단어일 수 있으므로 이는 문제가 됩니다. 나는 모든 사람을 위해 awk를 만들고 싶지 않습니다.

내 CLI 스크립트에서 'Value'에 포함된 모든 단어를 표시하도록 awk 또는 sed 또는 'Value'의 전체 내용을 전달하는 방법이 있습니까? 스크립트의 문자열 변수에 "값"을 전달해야 하기 때문에 이는 중요합니다.

예:

MYSTRING=`show attr=0x1230ac1 | sed 1d | awk '{print $3-$99}' `

나는 이것이 print $3-$99틀렸다는 것을 알고 있습니다. 이것은 가능한 모든 인쇄 번호를 입력하지 않고도 수행하려는 작업의 예일 뿐입니다.

답변1

awk에서는 빈 문자열을 할당하여 특정 필드/열을 제거할 수 있습니다.

$ echo foo bar doo | awk '{$2 = ""; print}'
foo  doo

그러나 이렇게 하면 필드가 있던 자리에 공백이 남고 asdf이전의 것과 같이 줄의 다른 공백이 축소됩니다.

$ echo "foo bar doo    asdf"  | awk '{$2 = ""; print}'
foo  doo asdf

대신, sed적절한 정규식을 사용하여 다음과 같은 작업을 수행할 수 있습니다.

$ echo '0x1230ac1     User_Attribute1       Brown Fox is Near' |
  sed -Ee 's/([^[:space:]]+[[:space:]]+){2}//'
Brown Fox is Near

[^[:space:]]+시리즈를 일치시키다공백이 아닌문자, [[:space:]]+공백 문자열 및 주변 내용은 (...){2}모두 두 번 실행되므로 두 번째 공백 이전의 모든 내용이 삭제됩니다. 공백이 공백이나 탭이면 이것이 작동합니다.

따라서 내 상황이 맞다면 다음과 같이 해야 합니다.

$ show attr=0x1230ac1 | sed -E -e 1d -e 's/([^[:space:]]+[[:space:]]+){2}//'

답변2

gnu sed를 사용하여 이 작업을 수행할 수 있습니다.

sed -nEe '2s/\S+/\n&/3;s/.*\n//p'

변수에 개행 문자가 없다고 가정합니다. 그리고 사용자 ID에는 공백이 포함되어 있지 않습니다.

관련 정보