구조화된 텍스트 파일에서 특정 유형의 속성을 가진 모든 레코드의 ID 속성을 추출합니다.

구조화된 텍스트 파일에서 특정 유형의 속성을 가진 모든 레코드의 ID 속성을 추출합니다.

업데이트: 먼저 해당 장치의 전체 구성 섹션을 살펴보고 문제를 해결했습니다. 그런 다음 다음 명령을 사용하십시오 egrep -wir 'peer' test* | uniq | sort | cut -d\ -f3 ~/test.txt.

  • 이것이 내가 얻은 결과입니다:
    neighbour
    00.000.0.000 (the IP address, I just put all 0s as an example)
    abc-hub
    nib
    SEC-INC-PA-int Azure_ER_key
    abc23
    ijf689
    jkl412
    kli456
    peer
    
    

출력으로만 가져오도록 필터링하려면 어떻게 해야 합니까? :

abc23
ijf689
jkl412
kli456

특정 위치의 허브별로 그룹화된 특정 고객의 모든 라우터 목록을 가져와야 합니다. 고객의 이름이 이라고 가정합니다 test.

  • 고객 구성 파일의 예는 다음과 같습니다.
    abc23   interface: Tunnel000
            Type:Hub
    aqw789  interface: Tunnel222
            Type:Spoke
    ert458  interface: Tunnel111
            Type:Spoke
    ijf689  interface: Tunnel333
            Type:Hub
    jkl412  interface: Tunnel000
            Type:Hub/Spoke
    kli456  interface: Tunnel111
            Type:Hub
    

이 명령을 사용해 보았습니다.

egrep -wir 'hub' test* cut -d : -f1 | uniq

하지만 기대했던 결과를 얻지 못했습니다.

출력이 다음과 같기를 원합니다.

abc23
ijf689
jkl412
kli456

참고로 저는 GNU를 사용하고 있습니다. Linux 버전 3.2.0-6-amd64, GCC 버전 4.9.2

귀하의 도움에 진심으로 감사드립니다! 감사합니다! :)

답변1

man grep awk다음을 읽고 수행하십시오.

grep -B1 -w -i "hub" test | \
  grep -i "interface:" | \
  awk '{print $1}'

답변2

grep -B 1 "Type:Hub" test* | grep "interface:" | awk '{print $1}'

답변3

다음 awk프로그램은 다음을 수행해야 합니다.

awk '$1~/^Type/{split($1,f,/:/);t=f[2]} $2~/^interface/{if (id && t~/Hub/) print id; id=$1; t=""} END{if (id && t~/Hub/) print id}' test.txt

:이는 추가 공백 없이(특히 문 Type안과 주변 /) 형식이 표시된 것과 정확히 같다고 가정합니다 .

  • "Word"로 시작하는 첫 번째 줄에서 줄을 배열 Type로 분할 하고 두 번째 항목을 변수로 저장합니다 .:ft
  • 두 번째 "Word"로 시작하는 줄에 interface첫 번째 "Word"(라우터 ID)를 저장합니다. 그 전에 이전 기록에서 라우터 ID가 저장되었는지 확인합니다. 그렇다면 이전 유형에 "Hub"라는 단어가 포함되어 있으면 이전 ID를 인쇄합니다. 또한 t구문 분석을 방해하는 "남은" 정보가 없는지 확인하기 위해 재설정했습니다 .
  • 파일 끝에서도 동일한 작업을 수행합니다.

답변4

sed -e 'N; y/\n/ /' -e '/Type:Hub/!d; s/ .*//' file

이것은 한 쌍의 interface:- Type:라인을 함께 결합하여 다음과 같은 라인을 N; y/\n/ /포함시킨 후sed

abc23   interface: Tunnel000         Type:Hub
aqw789  interface: Tunnel222         Type:Spoke
ert458  interface: Tunnel111         Type:Spoke
ijf689  interface: Tunnel333         Type:Hub
jkl412  interface: Tunnel000         Type:Hub/Spoke
kli456  interface: Tunnel111         Type:Hub

( N다음 줄을 버퍼에 추가하고 y/\n/ /줄 사이에 포함된 줄 바꿈을 공백으로 바꿉니다.)

명령의 나머지 부분은 sed일치하지 않는 모든 줄을 삭제한 Type:Hub다음 나머지 줄의 첫 번째 공백 문자 내의 모든 항목을 삭제합니다. /Type:Hub/!d불필요한 줄을 제거 하고 s/ .*//첫 번째 공간의 줄을 자릅니다.

당신이 얻는 최종 결과는

abc23
ijf689
jkl412
kli456

관련 정보