
다음과 같은 특정 속성을 사용하여 Cisco 인터페이스 섹션을 구문 분석하기 위한 Sed/Grep 또는 Awk 정규식이 있는지 알고 싶습니다.
file.txt의 내용
!
interface FastEthernet0/1
no ip unreachables
!
interface FastEthernet0/2
no ip proxy-arp
!
스크립트:
#!/bin/bash
VALUE="no ip proxy-arp"
awk -v RS='!\n' -v PATTERN=${VALUE} '/$PATTERN/' file.txt | awk '/^interface/';
exit 0
문제는 쉘에서 직접 라인을 실행하면 작동하지만 스크립트에서 실행하면 작동하지 않는다는 것입니다.
으로 실행해보면 변수 값을 대체할 수 없다는 bash -x
것을 알 수 있습니다 .awk
어떤 제안?
답변1
이것이 쉘에서 작동한다는 것을 믿기 어렵습니다. 그럼에도 불구하고 이 코드에는 몇 가지 오류가 포함되어 있으며 IMHO에 대한 접근 방식도 잘못되었습니다.
//
awk는 변수가 아닌 문자열을 기대합니다 . 이는 상수 정규식입니다. 따라서 쉘이 거기에 변수를 넣도록 하거나 ~
.
수정에 대한 접근 방식:
awk -v RS='!\n' -v PATTERN="${VALUE}" '$0 ~ PATTERN' file.txt |
awk '/^interface/'
이것이 효과가 있다는 사실에 놀랐습니다. 문서에서 나는 RS 설정으로 인해 원치 않는 "!" 인쇄될 것입니다. 그러나 나는 이것이 더 낫다고 생각합니다.
awk -v PATTERN="${VALUE}" \
'$0 ~ PATTERN { print previousline; }; { previousline=$0; }' file.txt
또는 하드코딩된 패턴으로
awk '/no ip proxy-arp/ { print previousline; }; { previousline=$0; }' file.txt
또는 쉘이 패턴을 작성하여
awk /"$VALUE"/' { print previousline; }; { previousline=$0; }' file.txt
답변2
에코 "! 인터페이스 FastEthernet0/1 연결할 수 없는 IP 없음 ! 인터페이스 FastEthernet0/2 IP 프록시-ARP 없음 " | pcregrep -M "^인터페이스 .*0/1\n (.*\n)!"
결과:
인터페이스 FastEthernet0/1 연결할 수 없는 IP 없음