【问题标题】:Extracting IP address from a line from ifconfig output with grep使用 grep 从 ifconfig 输出中的一行中提取 IP 地址
【发布时间】:2012-07-14 10:23:51
【问题描述】:

鉴于这条从ifconfig 提取的特定行,就我而言:

inet 192.168.2.13 netmask 0xffffff00 broadcast 192.168.2.255

如何提取192.168.2.13 部分(本地IP 地址),大概是用正则表达式?

【问题讨论】:

标签: regex grep


【解决方案1】:

这是使用grep的一种方式:

line='inet 192.168.2.13 netmask 0xffffff00 broadcast 192.168.2.256'

echo "$line" | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"

结果:

192.168.2.13
192.168.2.256

如果您只想选择有效地址,您可以使用:

line='inet 192.168.0.255 netmask 0xffffff00 broadcast 192.168.2.256'

echo "$line" | grep -oE "\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"

结果:

192.168.0.255

否则,只需使用awk选择您想要的字段,例如:

line='inet 192.168.0.255 netmask 0xffffff00 broadcast 192.168.2.256'

echo "$line" | awk -v OFS="\n" '{ print $2, $NF }'

结果:

192.168.0.255
192.168.2.256


附录:

Word boundaries:\b

【讨论】:

  • 非常感谢,但这也符合broadcast
  • @JJ56,也许使用awk 是更好的选择
  • @Kevin:是的,egrep 就足够了。我已经编辑了答案以反映这一点。谢谢。
  • 这匹配 >256 答案是错误的。您需要匹配
  • 啊,正确答案,更好的正确答案。使用有限的输入 (ifconfg) 模式是正确的。
【解决方案2】:

使用这个正则表达式((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?=\s*netmask)

【讨论】:

  • 再一次,除非我做错了什么,否则这会给出整行
【解决方案3】:

你可以使用 egrep (与 grep -E 基本相同)
在 egrep 中有用于字符类的命名组,例如:“digit”
(在这种情况下,这会使命令更长 - 但你明白了......)

另一件值得了解的事情是,您可以使用方括号来重复模式

ifconfig | egrep '([0-9]{1,3}\.){3}[0-9]{1,3}'

或

ifconfig | egrep '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}'


如果您只关心实际 IP 地址,请使用参数 -o 将输出限制为 匹配模式 而不是整行:

ifconfig | egrep -o '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}'

...如果您不想要 BCast 地址等,您可以使用这个 grep:

ifconfig | egrep -o 'addr:([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' | egrep -o '[[:digit:]].*'

我以为你只是在谈论 IPv4 地址

【讨论】:

  • 谢谢!更进一步,获取 wlan0 地址: ifconfig | egrep -o 'addr:192.([[:digit:]]{1,3}\.){2}[[:digit:]]{1,3}' | egrep -o '[[:digit:]].*' 那行得通,我尽量避免使用 192 并做一个更通用的 ifconfig | egrep -o 'wlan0*addr:([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' | egrep -o '[[:digit:]].*' 但这不起作用...欢迎任何想法。
【解决方案4】:

只是添加一些替代方式:

ip addr | grep -Po '(?!(inet 127.\d.\d.1))(inet \K(\d{1,3}\.){3}\d{1,3})' 

它将打印出除本地主机之外的所有 IP。

【讨论】:

    【解决方案5】:

    [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}

    【讨论】:

    • 抱歉,我该如何将它放入 grep 中?使用echo '[the line]' | grep -P '[your answer]' 给了我整行:\
    • 你匹配以点分隔的 3 位数字,这不是 ip,你会看到广播
    【解决方案6】:

    我没有足够的声望点来发表评论,但我在 Steve 的“仅选择有效地址”正则表达式中发现了一个错误。我不太明白这个问题,但我相信我已经找到了解决办法。第一个命令演示了这个错误;第二个演示了修复:

    $ echo "test this IP: 200.1.1.1" |grep -oE "\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"
    $ echo "test this IP: 200.1.1.1" |grep -oE "\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"
    200.1.1.1
    $
    

    【讨论】:

      【解决方案7】:

      使用sed 的一种方式。第一条指令删除行中第一个数字之前的所有字符,第二条指令保存第 1 组 (\1) 中的第一个 IP 并用它替换所有行:

      sed -e 's/^[^0-9]*//; s/\(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\).*/\1/'
      

      【讨论】:

      • 这将打印无效的 IP 地址。
      【解决方案8】:

      也许这个,一个 sed 命令,只用于运动:

          ip -o -4 addr show dev eth0 | sed 's/.* inet \([^/]*\).*/\1/'
      

      【讨论】:

        【解决方案9】:

        这段代码也很好用,也很简单。

        ifconfig | grep Bcast > /tmp/ip1
        cat /tmp/ip1 | awk '{ print $2 }' > /tmp/ip2
        sed -i 's/addr://' /tmp/ip2
        IPADDRESS=$(cat /tmp/ip2)
        echo "$IPADDRESS"
        

        【讨论】:

          【解决方案10】:
          grep -oE "\b([0-9]{1,3}\.?){4}\b"
          

          【讨论】:

            【解决方案11】:

            此代码适用于我的 树莓派零 w。

            (从ifconfig输出中提取wlan0:inet192.168.x.y地址)

            在 ifconfig 输出中搜索模式 'inet 192' 并使用 space 分隔符获得第 10 位。

             $> ifconfig |grep 'inet 192'|cut -d' ' -f10
            

            输出: 192.168.1.6

            【讨论】:

            • 最佳实践是使用tr 命令ifconfig |grep 'inet 192'| tr -s ' ' | cut -d' ' -f2 压缩空间
            【解决方案12】:

            如果使用支持 Perl 正则表达式的 grep:

            (your command that pulls mentioned line) | grep -Po 'inet \K[\d\.]+'
            

            【讨论】:

              猜你喜欢
              • 2019-08-19
              • 1970-01-01
              • 2017-11-16
              • 2011-11-03
              • 2017-08-31
              • 1970-01-01
              • 2014-07-19
              • 1970-01-01
              • 2013-06-10
              相关资源
              最近更新 更多