首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从包括它们在内的两种模式之间选择第一次出现

如何从包括它们在内的两种模式之间选择第一次出现
EN

Unix & Linux用户
提问于 2019-07-18 10:03:15
回答 2查看 411关注 0票数 2

我所拥有的:

代码语言:javascript
复制
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的方法,如许多类似的线程所示:

代码语言:javascript
复制
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$

代码语言:javascript
复制
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等等。如果我用

代码语言:javascript
复制
sed -n -e '/2\/1\/6.2061/,/\!/p ;' idc3-sfc
awk '/2\/1\/6.2061/{p=1} p' idc3-sfc

它将显示任何匹配(如此成千上万行)

我在这里只发了几条我跟踪的线索:

通过创建一个新文件将示例文本放入其中,我发现了这个问题。

如果我用:

代码语言:javascript
复制
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$

这是可行的,但如果我试图通过击球来获得第二个街区:

代码语言:javascript
复制
usr@mpls-fa-1:~/CIRCUITI_DA_DISMETTERE$ awk '/2\/1\/6.2062/{p=1} p ; /!/{exit}' TEST
usr@mpls-fa-1:~/CIRCUITI_DA_DISMETTERE$

它不能工作

EN

回答 2

Unix & Linux用户

发布于 2019-07-18 11:58:43

您的第一个sed示例不适用于第二个和接下来的块,因为/!/q (反斜杠可能导致未定义的行为,因此我删除它)已经为第一个!执行了,并且脚本停止在那里(对于awk脚本的exit也是如此)。所以,只在块之后执行它,使用

代码语言:javascript
复制
sed -n '/2\/1\/6.2062/,/!/{p;/!/q;}'

但很简单

代码语言:javascript
复制
sed -n '/2\/1\/6.2062/,/!/p'

就像第二次尝试一样,如果浪费一些cpu周期没有问题的话,也可以工作。

对于未来的脚本,如果地址模式包含类似的斜杠,我建议使用不同的分隔符

代码语言:javascript
复制
sed -n '\_2/1/6.2062_,/!/p'

更容易读,对吧?

是的,您也可以使用!d

代码语言:javascript
复制
sed '\_2/1/6.2062_,/!/!d'
票数 0
EN

Unix & Linux用户

发布于 2019-07-19 20:14:23

在你最后一次改变中:

代码语言:javascript
复制
p ; /!/{exit}

代码语言:javascript
复制
p {print; if (/!/) exit}

因此,在处理您感兴趣的块之后退出,而不是在文件中的第一个块的末尾退出。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/530834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档