1개의 멀티캐스트 그룹 인스턴스와 관련된 3~5줄의 정보가 포함된 파일이 있고, 이 파일에는 여러 개의 멀티캐스트 그룹 인스턴스가 포함되어 있습니다.
Group: 239.103.0.64
Source: 10.12.49.30/32
Upstream interface: ge-0/0/7.0
Group: 239.103.0.66
Source: 10.12.49.38/32
Upstream interface: ge-0/0/9.0
Group: 239.103.0.71
Source: 10.12.49.2/32
Upstream interface: ge-0/0/0.0
Downstream interface list:
xe-5/0/0.0
Group: 239.103.0.72
Source: 10.12.49.6/32
Upstream interface: ge-0/0/1.0
Downstream interface list:
xe-5/0/0.0
xe-5/0/1.0
각 인스턴스에 대해 멀티캐스트 IP 주소, 소스 IP 주소, 업스트림 인터페이스 및 다운스트림 인터페이스 목록이 포함된 출력 한 줄을 생성하려고 합니다. 여기서 필드는 다음으로 구분됩니다.:". 위의 출력이 다음과 같기를 바랍니다.
239.103.0.64:10.12.49.30/32:ge-0/0/7.0:
239.103.0.66:10.12.49.38/32:ge-0/0/9.0:
239.103.0.71:10.12.49.2/32:ge-0/0/0.0:xe-5/0/0.0
239.103.0.72:10.12.49.6/32:ge-0/0/1.0:xe-5/0/0.0 xe-5/0/1.0
답변1
awk '
/Group:/ {g=$2; next}
/Source:/ {s=$2; next}
/Upstream interface:/ {u=$3; next}
/Downstream interface list:/ {dflag=1; next}
/^$/ {print g ":" s ":" u ":" d; g = s = u = d = ""; dflag = 0; }
{ if (dflag) { if (d == "") d = $1; else d = d " " $1} }
END {print g ":" s ":" u ":" d; g = s = u = d = ""; dflag = 0; }
'
- 프로그램의 처음 세 줄은
awk
매우 간단합니다. 해당 레이블이 표시되면 멀티캐스트 IP 주소, 소스 IP 주소 및 업스트림 인터페이스에 대한 값을 캡처합니다. - 네 번째 줄은 "다운스트림 인터페이스 목록" 레이블을 확인한 후 후속(공백이 아닌) 줄에 다운스트림 인터페이스가 포함되어 있음을 알 수 있도록 플래그를 설정합니다.
- 다음 여섯 번째 줄을 보는 것이 더 합리적입니다. "다운스트림 인터페이스 목록" 레이블이 보이면 나열된 값을 수집하고 공백으로 구분합니다.
- 5행과 7행은 거의 동일합니다. 빈 행이나 파일의 끝에 도달하면 지금까지 수집된 데이터를 인쇄합니다.
답변2
예쁘지는 않지만 작업이 완료되었다고 생각합니다.
awk -F":" 'BEGIN {RS=""};{$1="";$3=$5=$7=":";gsub(/(\ *)?:(\ *)?/,":");print $0}' test.txt |tr -s " "
답변3
뒤에 공백이 있어도 괜찮다면 다음과 같이 말할 수 있습니다.
awk -v RS='' -v OFS=':' -F'[:\n] *' '{ print $2, $4, $6, $9 " " $10 }'