使用Bash解析ifconfig以获取我的IP地址

19

我想编辑bashrc文件,添加一个名为“myip”的简单函数并运行。正如你所猜测的那样,函数myip仅打印出我的机器的内部IP地址。

到目前为止,我完成的脚本是:

ifconfig en1 | awk '{ print $2}' | sort

这是我得到的输出结果:

10.0.0.12
options=1<PERFORMNUD>
flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST>
fe80::daa2:5eff:fe96:ba2f%en1
d8:a2:5e:96:ba:2f
autoselect
active

我正在使用 Mac OS X。

我该如何完成这个任务?


3
哪个操作系统?哪个ifconfig命令? - Tripp Kinetics
2
ifconfig en1 | sed -n '/inet addr/s/.*addr.\([^ ]*\) .*/\1/p' 至少在 Ubuntu 和 Fedora 上可用... 根据您的 ifconfig en1 输出,如果需要可以进行更多调整。 - anishsane
1
/sbin/ifconfig $1 | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}'由于该命令通常只有root用户才能使用,因此将其位置定义为/sbin。 - user3442743
20个回答

0

使用:

ifconfig enops3 | grep broadcast | cut -d " " -f10

enops3 是接口名称。


注意应该是grep而不是greb(想编辑答案但提示队列已满)。 - Adam Shand

0

代码也适用于VDS/VPS:

ifconfig | grep -A2 "venet0:0\|eth0" | grep 'inet addr:' | sed -r 's/.*inet addr:([^ ]+).*/\1/' | head -1

或者

ifconfig | grep 'inet addr:' | grep -v 127.0.0.1 | head -n1 | cut -f2 -d: | cut -f1 -d ' '

0

这段代码输出所有网络连接(除了回环)的 IP 地址,并且在大多数 OS X 和 Linux 版本之间是可移植的。

它特别适用于在以下情况下运行脚本的计算机:

  • 活动的网络适配器未知,
  • 无线和以太网连接之间切换的笔记本电脑,以及
  • 具有多个网络连接的计算机。

这个脚本是:

/sbin/ifconfig -a | awk '/(cast)/ {print $2}' | cut -d: -f2

这可以在脚本中赋值给一个变量,就像这样:

myip=$(/sbin/ifconfig -a | awk '/(cast)/ {print $2}' | cut -d: -f2)

脚本可以通过使用循环来处理结果,从而处理可能的多个地址,如下所示:

if [[ -n $myip ]]; then
  count=0
  for i in $myip; do
    myips[count]=$i       # Or process as desired
    ((++count))
  done
  numIPaddresses=$count   # Optional parameter, if wanted
fi

注:

  • 它在“cast”上过滤了“ifconfig”,因为这样可以过滤掉回环地址,同时也适用于大多数OS X和Linux版本。
  • 最后的“cut”函数对于Linux的正确功能是必要的,但不适用于OS X。然而,它不会影响OS X的结果 - 因此保留以实现可移植性。

0
这对我有效:
ifconfig eth0 | awk '/inet addr/{print substr($2,6)}'

0

参考 patch 的答案,使其更为普遍:

即:跳过直到第一个数字。

ifconfig eth0 | awk '/inet addr/{sub(/[^0-9]*/,""); print $1}'

甚至更好:

ifconfig eth0 | awk '/inet /{sub(/[^0-9]*/,""); print $1}'

  • 请注意末尾的 print 部分 - 从$2更改为$1

使用 Perl 正则表达式:

ifconfig eth0 | grep -oP '(?<= inet addr:)[^ ]+'

说明: grep -oP 使用 Perl 正则表达式搜索精确匹配。
“棘手”的部分是正则表达式本身;
1. (?<= inet addr:) 的意思是-字符串inet addr:在我们正在寻找的东西的左边。
2. [^ ]+(请注意 ^ 后面的空格)-它的意思是查找直到第一个空白的所有内容-在我们的情况下就是 IP 地址。


0
在遇到使用grep命令来处理ifconfig时,我找到了一个包装库来简化我的工作。
pip install my_ip 
mip

1
ifconfig is not used now days. Instead, we have ip - Farbod Ahmadian

0

类似于JSR,但是顺序与awkcut相反:

my_ip=$(ifconfig en1 | grep 'inet addr' | awk '{print $2}' | cut -d: -f 2)
echo ${my_ip}

0

在尝试了一些解决方案后,我发现这个最方便, 将此添加到您的别名中:

alias iconfig='ifconfig | awk '\''{if ( $1 >= "en" && $2 >= "flags" && $3 == "mtu") {print $1}; if ( $1 == "inet" || $1 == "status:"){print $0};}'\''|egrep "en|lo|inet"'

输出结果如下:

shady@Shadys-MacBook-Pro:xxxx/xxx ‹dev*›$ iconfig lo0: inet 127.0.0.1 netmask 0xff000000 en0: inet 10.16.27.115 netmask 0xffffff00 broadcast 10.16.27.255 en1: en2: en5: inet 192.168.2.196 netmask 0xffffff00 broadcast 192.168.2.255


-1
ifconfig eth0 | awk '/inet addr/{sub("addr:",""); print $2}'

虽然这段代码可能回答了问题,但是提供关于为什么和/或如何回答问题的额外上下文可以提高其长期价值。 - JAL

-1
一个简单的 AWK + Bash 脚本示例,可以提供解析命令输出和混合语法的一般思路。
完整代码在:https://gist.github.com/darkphase/67d7ec22d47dbebd329e
BEGIN { RS = "" ; FS = "\n" }  # Change separator characters
{
    while ( "'"$cmd"'" | getline ){
        # print $0
        if ( $1 !~ /LOOPBACK/ ){

            split($1,arr," ")
            print "'"$blue"'"arr[1]"'"$reset"'"

            for(i = 1; i <= NF; i++) { # Loop through fields (this case lines)
                split($i,arr," ")
                switch ( arr[1] ) {
                    case "inet":
                        print "'"$red"'" "IPV4:" "'"$reset"'" "\n IP: " "'"$yellow"'" arr[2] "'"$reset"'" "\n NM: "arr[4]"\n BC: "arr[6]
                        break
                    case "inet6":
                        print "'"$red"'" "IPV6:" "'"$reset"'" "\n IP: "arr[2]"\n PL: "arr[4]
                        break
                    case "ether":
                        print "'"$red"'" "MAC: " "'"$reset"'" arr[2]
                        break
                    default:
                }
            }
            print ""
        }
    }
}'

哦,天啊,你没看到其他一行代码的答案吗? - sidney
不错的脚本,但你的只是简单地显示了它们,和使用ifconfig一样毫无区别... 对于脚本应用来说并不实用... - Mike Q

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接