업데이트: 먼저 해당 장치의 전체 구성 섹션을 살펴보고 문제를 해결했습니다. 그런 다음 다음 명령을 사용하십시오 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
로 분할 하고 두 번째 항목을 변수로 저장합니다 .:
f
t
- 두 번째 "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