여러 단어가 포함된 속성이 있습니다.
예:
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에는 공백이 포함되어 있지 않습니다.