다음을 반환하는 명령이 있습니다.
id1="172" id2="17" id3="136" id4="5" id5="0" />
id1="172" id2="17" id3="128" id4="2" id5="0" />
id1="172" id2="17" id3="128" id4="4" id5="0" />
id1="172" id2="17" id3="128" id4="6" id5="0" />
결합된 처음 4개의 ID는 IP 주소(예: 172.17.136.5
첫 번째 행)를 나타냅니다.
위의 내용을 공백으로 구분된 모든 IP 주소가 포함된 문자열을 출력하는 구문 분석 명령으로 파이프하고 싶습니다.
위의 예에서는 다음과 같습니다.
myVariable="172.17.136.5 172.17.128.2 172.17.128.4 172.17.128.6"
어떻게 해야 하나요?
답변1
awk
다음 명령을 사용하면 가장 쉽게 이 작업을 수행 할 수 있습니다 .
your-command | awk -F\" -v OFS=. -v ORS=' ' '{print $2, $4, $6, $8}'
변수로 설정하려면 명령 대체를 사용하십시오.
myVariable="$(your-command | awk -F\" -v OFS=. -v ORS=' ' '{print $2, $4, $6, $8}')"
-F
입력 필드 구분 기호(기본값은 공백)를 사용자 정의 값으로 설정합니다. 이 경우 큰따옴표( "
)입니다.
-v
변수를 설정할 수 있습니다 awk
.
OFS
출력 필드 구분 기호이며 기본값은 단일 공백입니다. 우리는 그것을 마침표로 설정했습니다.
ORS
출력은기록구분 기호, 기본값은 개행입니다. 우리는 그것을 공백으로 설정했습니다.
그런 다음 입력한 각 줄의 두 번째, 네 번째, 여섯 번째 및 여덟 번째 필드를 인쇄합니다.
예제 출력:
$ cat temp
id1="172" id2="17" id3="136" id4="5" id5="0" />
id1="172" id2="17" id3="128" id4="2" id5="0" />
id1="172" id2="17" id3="128" id4="4" id5="0" />
id1="172" id2="17" id3="128" id4="6" id5="0" />
$ myVariable="$(cat temp | awk -F\" -v OFS=. -v ORS=' ' '{print $2, $4, $6, $8}')"
$ echo "$myVariable"
172.17.136.5 172.17.128.2 172.17.128.4 172.17.128.6
$
답변2
myvariable=$(yourmysterycommand |
sed -e 's/id1=//;
s/id5=.*//;
s/"//g;
s/id.=/./g;
s/[[:blank:]]\+//g' |
paste -sd' ')
한 번에 한 줄씩 작성되지만 가독성을 위해 줄 바꿈과 들여쓰기를 추가하여 형식을 다시 지정했습니다.
$ echo "$myvariable"
172.17.136.5 172.17.128.2 172.17.128.4 172.17.128.6
이 sed
명령은 문자열을 제거한 id1=
다음 id5=
및 뒤의 모든 항목을 제거한 다음 모든 큰따옴표 문자( "
)를 제거하고 모든 항목을 id.=
리터럴로 변경 .
하고 마지막으로 줄에서 모든 공백 문자(공백 및/또는 탭)를 제거합니다.
이 paste
명령은 공백 문자를 구분 기호로 사용하여 줄을 연결합니다.
그런데 더 나은 해결책은 이렇게 쓸모없고 어리석은 형식으로 IP 주소를 인쇄하는 프로그램을 수정하는 것입니다. IP 주소의 옥텟은 어떤 종류의 "ID"도 아닙니다.