Bash 명령줄을 사용하여 IP 문자열 쓰기

Bash 명령줄을 사용하여 IP 문자열 쓰기

다음을 반환하는 명령이 있습니다.

 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"도 아닙니다.

관련 정보