返回 Perl Regex 的输出

返回 Perl Regex 的输出

inet我一直在尝试从 UP 适配器返回值ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:19:21:f5:04:42 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.100/24 brd 192.168.1.255 scope global enp0s7
       valid_lft forever preferred_lft forever
    inet6 fe80::4672:94c8:d31b:a04a/64 scope link
       valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 52:54:00:29:38:4d brd ff:ff:ff:ff:ff:ff

我有这个正则表达式来找到它,但它返回整行,正如 grep 所期望的那样:

([0-9]+:.{1,}state UP.{1,}(\n.{1,}?){1,}inet )\K([0-9]{1,3}\.?){4}

返回这个:

inet 192.168.1.100/24 brd 192.168.1.255 scope global enp0s7

我想要它做的是只是返回192.168.1.100(后面的IP inet)。 grep 可以以某种方式做到这一点吗?如果不能,正确的方法是什么?

编辑:好的,这是脚本的相关部分:

NUMOFNETWORKADAPTERS="$(ip addr | grep -Pc '[0-9]{1}: ')"
IPOFACTIVEADAPTER="$(ip addr | grep -Pc '(?<=state UP(.+\n){2,$NUMOFNETWORKADAPTER}?    inet )[^/]{1,15}')"

echo "LOCAL IP: $IPOFACTIVEADAPTER"

但这会产生lookbehind assertion is not fixed length错误。

答案1

grep此处可能不是最佳选择,尽管启用了 PCRE grep,并且-o可以使用零宽度后向匹配来获取 IP 地址,以查找inet并匹配其后的 IP。

ip addr | grep -Po '(?<=inet )[^/]+'

对于“获取已启动设备的inet addr”的多行问题,类似于

ip link | awk -F: '/state UP/{print $2}' \
| while read updev; do \
  ip addr show $updev | grep -Po '(?<=inet )[^/]+'; done

可能更合适。

答案2

实际上,正则表达式

([0-9]+:.{1,}state UP.{1,}(\n.{1,}?){1,}inet )\K([0-9]{1,3}\.?){4}

你首先提出的,作品,具有适当的环境和 Perl:

$ perl -l -0 -ne 'print $& if /([0-9]+:.{1,}state UP.{1,}(\n.{1,}?){1,}inet )\K([0-9]{1,3}\.?){4}/'  < output_of_your_ip_addr
192.168.1.100

-0完整读取文件(而不是逐行),并包含匹配部分(删除左侧部分$&后剩下的部分)。\K


虽然如果 Perl 可用,我会写

ip addr | perl -l -0ne  'print $1 while /state UP.*?inet ([0-9.]+)/sg'

打印所有匹配项。 (更改whileif仅获取第一个匹配项。$1包含第一个()匹配项。)

相关内容