파일의 반복되는 행 "그룹화"에서 텍스트 부분을 구문 분석해야 함

파일의 반복되는 행 "그룹화"에서 텍스트 부분을 구문 분석해야 함

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 }'

관련 정보