从结构化文本文件中提取具有特定类型属性的所有记录的 ID 属性

从结构化文本文件中提取具有特定类型属性的所有记录的 ID 属性

更新:我通过首先查看该设备中的整个配置部分解决了这个问题。然后使用这个命令: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;海湾合作委员会版本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

相关内容