我所拥有的:
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 with !d等等。如果我用
sed -n -e '/2\/1\/6.2061/,/\!/p ;' idc3-sfc
awk '/2\/1\/6.2061/{p=1} p' idc3-sfc它将显示任何匹配(如此成千上万行)
我在这里只发了几条我跟踪的线索:
通过创建一个新文件将示例文本放入其中,我发现了这个问题。
如果我用:
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$它不能工作
发布于 2019-07-18 11:58:43
您的第一个sed示例不适用于第二个和接下来的块,因为/!/q (反斜杠可能导致未定义的行为,因此我删除它)已经为第一个!执行了,并且脚本停止在那里(对于awk脚本的exit也是如此)。所以,只在块之后执行它,使用
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'发布于 2019-07-19 20:14:23
在你最后一次改变中:
p ; /!/{exit}至
p {print; if (/!/) exit}因此,在处理您感兴趣的块之后退出,而不是在文件中的第一个块的末尾退出。
https://unix.stackexchange.com/questions/530834
复制相似问题