내가 가진 것:
interface GigabitEthernet0/2/1/6.2061
description --> Some description here
service-policy input BESTEFFORT-IN
service-policy output Egress_30M
vrf VPN-s2s
ipv4 mtu 1500
ipv4 address 222.222.222.1 255.255.255.252
ipv4 unreachables disable
dot1q vlan 2061
!
interface GigabitEthernet0/2/1/6.2062
description Some Description here too
service-policy input BESTEFFORT-IN
vrf TRUSTED-3879
ipv4 mtu 1500
ipv4 address 111.111.111.111 255.255.255.252
--
[thousands of same data blocks]
내가 얻고 싶은 것 :
패턴 1(예: 2/1/6.2061)과 블록 끝(! 문자여야 함) 사이의 모든 데이터를 가져옵니다.
이제 많은 유사한 스레드에서 볼 수 있듯이 sed 및 awk를 사용하여 다양한 접근 방식을 시도했습니다.
usr@mpls-fa-1:~/CIRCUITI_DA_DISMETTERE$ awk '/2\/1\/6.2061/{p=1} p; /\!/{exit}' idc3-sfc
usr@mpls-fa-1:~/CIRCUITI_DA_DISMETTERE$
그리고
usr@mpls-fa-1:~/CIRCUITI_DA_DISMETTERE$ sed -n -e '/2\/1\/6.2061/,/\!/p ; /\!/q' idc3-sfc
usr@mpls-fa-1:~/CIRCUITI_DA_DISMETTERE$
sed 및 !d 등과 같은 더 많은 변형이 있습니다. 내가 사용한다면
sed -n -e '/2\/1\/6.2061/,/\!/p ;' idc3-sfc
awk '/2\/1\/6.2061/{p=1} p' idc3-sfc
일치하는 항목이 표시됩니다(따라서 수천 개의 행).
제가 여기에 게시하는 내용은 제가 관심 있는 주제 중 일부입니다.
- sed: 패턴 일치의 첫 번째 발생만 인쇄
- 두 패턴(포함) 사이에서 첫 번째 발생을 선택하는 방법
- https://www.linuxquestions.org/questions/programming-9/grep-until-certain-character-or-pattern-appears-816393/
새 파일을 만들고 그 안에 샘플 텍스트를 넣어서 문제를 발견했습니다.
내가 사용하는 경우:
usr@mpls-fa-1:~/CIRCUITI_DA_DISMETTERE$ awk '/2\/1\/6.2061/{p=1} p ; /!/{exit}' TEST
interface GigabitEthernet0/2/1/6.2061
description --> Some description here
service-policy input BESTEFFORT-IN
service-policy output Egress_30M
vrf VPN-s2s
ipv4 mtu 1500
ipv4 address 222.222.222.1 255.255.255.252
ipv4 unreachables disable
dot1q vlan 2061
!
usr@mpls-fa-1:~/CIRCUITI_DA_DISMETTERE$
["첫 번째 텍스트 블록"이기 때문에] 작동하지만 클릭하여 두 번째 블록을 가져오려고 하면 다음과 같습니다.
usr@mpls-fa-1:~/CIRCUITI_DA_DISMETTERE$ awk '/2\/1\/6.2062/{p=1} p ; /!/{exit}' TEST
usr@mpls-fa-1:~/CIRCUITI_DA_DISMETTERE$
작동하지 않습니다. [6.2061 대신 인터페이스 6.2062를 검색하고 있기 때문에]
답변1
첫 번째 sed
예는 두 번째 및 후속 블록에서는 작동하지 않습니다. 왜냐하면 /!/q
(백슬래시로 인해 정의되지 않은 동작이 발생할 수 있으므로 제거했습니다) 첫 번째 블록이 이미 실행되고 !
스크립트가 거기서 중지되기 때문입니다( script 와 exit
동일 awk
). 따라서 블록 이후에만 실행하고,
sed -n '/2\/1\/6.2062/,/!/{p;/!/q;}'
하지만 간단한
sed -n '/2\/1\/6.2062/,/!/p'
일부 CPU 주기를 낭비해도 괜찮다면 두 번째 시도와 동일하게 수행하십시오.
향후 스크립트에서는 주소 패턴에 슬래시가 포함된 경우 다른 구분 기호를 사용하는 것이 좋습니다.
sed -n '\_2/1/6.2062_,/!/p'
읽기가 더 쉽죠?
예, 다음을 사용할 수도 있습니다 !d
.
sed '\_2/1/6.2062_,/!/!d'
답변2
최종 awk 스크립트 변경 사항은 다음과 같습니다.
p ; /!/{exit}
도착하다
p {print; if (/!/) exit}
따라서 파일의 첫 번째 블록 끝이 아닌 관심 있는 블록을 처리한 후 종료합니다.