【问题标题】:Only get the first part of grep: get ip of ifconfig只获取 grep 的第一部分:get ip of ifconfig
【发布时间】:2019-09-07 02:59:07
【问题描述】:
ifconfig | grep -m1 "inet addr" 

给我

inet addr:172.30.1.6  Bcast:172.30.140.255  Mask:255.255.252.0

但是,我只想要 ip,即172.30.1.6。我怎样才能做到这一点? 请注意,我必须使用 ifconfig,因为这是一个功能有限的嵌入式系统。

【问题讨论】:

  • 有几个 *nix 实用程序可以处理您拥有的第一行...cutsed 等。
  • "... 我必须使用 ifconfig ..." - 祝 Fedora 和其他人好运,ifconfig 不见了,您必须使用 @ 987654327@ 实用程序。

标签: linux bash shell grep ifconfig


【解决方案1】:

一种方法..

ifconfig | grep -m1 "inet addr" | awk '{print $2}' | awk -F: '{print $2}'

【讨论】:

    【解决方案2】:

    使用带分隔符的剪切

    | cut -d':' -f 2 | cut -d' ' -f 1
    

    【讨论】:

    • 这会在 before 之前为所有内容提供第一个冒号,即inet addr
    • 这里相同@StephenP
    • 你只需要两次切割,看我的回答。
    • 这就是我在手机上打字的结果。编辑为 -f 2
    【解决方案3】:

    拿出你的剪刀,时间到了。

    echo inet addr:172.30.1.6  Bcast:172.30.140.255  Mask:255.255.252.0 | cut -d : -f 2 | cut -d " " -f 1
    

    【讨论】:

      【解决方案4】:

      如果您只想获取 ip 地址,使用 hostname -i (参考Which terminal command to get just IP address and nothing else?)可能有更简单的方法

      由于其他人提到了 cut 和 awk,我将提供一个使用 sed 的解决方案:

      echo "inet addr:172.30.1.6 Bcast:172.30.140.255 掩码:255.255.252.0" | sed -e "s/.*\(addr:[^ ]*\) .*/\1/" 地址:172.30.1.6 echo "inet addr:172.30.1.6 Bcast:172.30.140.255 掩码:255.255.252.0" | sed -e "s/.*addr:\([^ ]*\) .*/\1/" 172.30.1.6

      【讨论】:

      • sed 万岁!
      【解决方案5】:

      只需使用命令cut

      ip a | grep -m1 "inet addr" | cut -d':' -f 2 | cut -d' ' -f 1 
      

      我还建议您学习其他命令的使用,例如:wc,sed,tr,sort,uniq。他们将帮助您随心所欲地操纵输出。这是一个小课,我们向您展示所有这些命令:https://www.javatpoint.com/linux-filters

      希望能帮到你。

      【讨论】:

        【解决方案6】:

        这就是你想要做的一切吗?

        awk -F'[: ]' '/inet addr/{print $3; exit}'
        

        例如使用cat file 代替ifconfig

        $ cat file
        inet addr:172.30.1.6  Bcast:172.30.140.255  Mask:255.255.252.0
        
        $ cat file | awk -F'[: ]' '/inet addr/{print $3; exit}'
        172.30.1.6
        

        【讨论】:

          【解决方案7】:

          使用 Bash 的正则表达式运算符=~

          $ [[ $(ifconfig | grep -m1 "inet addr") =~ [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+ ]] && echo ${BASH_REMATCH[0]}
          172.30.1.6
          

          更新:在 cmets 中有更好的东西。

          【讨论】:

          • 我喜欢尽可能多地使用纯bash 而不是依赖awksedcut 等的想法。 al.,但为什么不把grep 也去掉呢? [[ $(ifconfig) =~ inet\ addr:([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+) ]] && echo ${BASH_REMATCH[1]}
          【解决方案8】:

          这是一种使用单个sed 命令的方法,无需调用grep

          ifconfig | sed -n '/inet addr/{s/^.*inet addr:\([^ ]*\).*$/\1/p;q}'
          

          这里发生了一些事情:

          • sed -n 告诉 sed 不要像往常一样打印每一行
          • /inet addr/ 是一个sed 地址 - 它告诉sed 只对包含"inet addr" 的行进行操作
          • {} 括号定义要运行的命令块,命令由; 分隔
          • s 命令相当简单 - 它只是捕获 IP 并仅用 IP 替换整行
          • s 命令末尾的p 标志 告诉sed 打印替换的结果。这是必要的,因为我们使用 -n 选项调用了 sed
          • q 命令告诉sed 退出,以便它只处理包含"inet addr"第一行 行。

          使用-n 选项、/inet addr/ 地址、s 命令上的p 标志和q 命令,本质上与grep -m1 "inet addr" 具有相同的效果,这使得调用@987654348 @不必要的。事实上,值得注意的是,以下命令会产生相同的输出:

          > ifconfig | grep -m1 "inet addr"
                   inet addr:192.168.1.1  Bcast:192.168.2.255  Mask:255.255.255.0
          
          > ifconfig | sed -n '/inet addr/{p;q}'
                   inet addr:192.168.1.1  Bcast:192.168.2.255  Mask:255.255.255.0
          

          在这里,我省略了sed 命令中的s/pattern/replacement/p 部分,并用p 命令替换它(它只打印整行),只是为了单独显示其他部分的效果.

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-07-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多