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