bash - 按单个字符分割并按字符串匹配找到的项目

bash - 按单个字符分割并按字符串匹配找到的项目

长话短说:

考虑到以下输入(这是来自节点的某种设备“列表”),我想获取 IP 地址,但只能从名为“路由器”的设备获取 IP 地址。 (不是 router1.、gw. 或其他):

gw.bec2,10.41.113.216,HNA: router.bec2,4|router.bec2,192.168.156.131,online,0
gw1.ros78,192.168.159.114,HNA: router.ros78,4|gw1test.ros78,10.41.112.118,HNA: router.ros78,8|gw34.ros78,192.168.159.13,HNA: router.ros78,4|router.ros78,192.168.159.125,online,0
router.jed99,10.41.118.189,online,0|router1.jed99,10.41.118.190,online,0|router2.jed99,10.41.118.191,erstellt: 09.10.14,9

最佳方法是以某种方式仅从示例中提取这些值:

192.168.156.131
192.168.159.125
10.41.118.189

很长的故事:

我正在解析 XML 文件以获取节点名称和节点 ID。现在我还需要名为“路由器”的设备的 IP。 XML 文件为每个节点提供了一个属性“devices”,它是该节点的设备列表,上面可以看到三个节点的示例。该“列表”通过管道“|”分隔设备及其属性以逗号“,”表示。

到目前为止,我能够获取节点名称和节点 ID,但现在很难获取 IP。

xpath -q -e 'concat(/nodes/node[@name="bec2"]/@name,"-",/nodes/node[@name="bec2"]/@nodeid,"-",/nodes/node[@name="bec2"]/@devices)' map.xml
# output:
# bec2-169-gw.bec2,10.41.113.216,HNA: router.bec2,4|router.bec2,192.168.156.131,online,0
# but needed output would be something like:
# bec2-169-192.168.156.131

我尝试了类似的方法,但每个节点的设备顺序不同,因此按数字选择字段似乎不合适:

xpath -q -e 'concat(/nodes/node[@name="bec2"]/@name,"|",/nodes/node[@name="bec2"]/@nodeid,"|",/nodes/node[@name="bec2"]/@devices)' map.xml | cut -d"|" -f 1,2,4
xpath -q -e 'concat(/nodes/node[@name="ros78"]/@name,"|",/nodes/node[@name="ros78"]/@nodeid,"|",/nodes/node[@name="ros78"]/@devices)' map.xml | cut -d"|" -f 1,2,4
# output:
# bec2|169|router.bec2,192.168.156.131,online,0
# ros78|1054|gw1test.ros78,10.41.112.118,HNA: router.ros78,8

我的想法是按管道分割,获取每个设备,然后搜索字符串“router.”,然后获取找到的设备并用逗号分割以获得第二个属性。

但我不知道是否以及如何可以按字符分割并不按数字而是通过搜索字符串来选择结果?

谢谢。

(我无法添加标签 xpath,因为它需要 300 声誉)

答案1

使用grepcut

<file grep -Eo 'router\.[^,]*,[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | cut -d, -f2
  • grep对于router\.后跟任意数量的非逗号字符的部分[^,]*,后跟逗号,和 IP 地址
  • cut然后使用和 分隔符删除第一部分,-d,留下第二个字段-f2

答案2

假设|是您的数据分隔符。

grep -Po '\brouter\.[^|]+?(\d{1,3}\.){3}\d{1,3}' data  | grep -Po '(?<=,).*'
  • 第一个 grep 结果:
    router.bec2,192.168.156.131
    router.ros78,192.168.159.125
    router.jed99,10.41.118.189
  • 第二个 grep 结果:
    192.168.156.131
    192.168.159.125
    10.41.118.189

相关内容