18

我想编辑 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。

我怎样才能完成这项工作?

4

20 回答 20

26

以下两项都在这里工作(CentOS 5)。

ip addr show eth0 | awk '$1 == "inet" {gsub(/\/.*$/, "", $2); print $2}'

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

对于 OS X(至少v10.11(El Capitan)):

ifconfig en0 | awk '$1 == "inet" {print $2}'
于 2014-05-29T13:46:17.063 回答
21

这是获取 IP 地址的更“不可知”的方式,无论您的 *nix 系统(Mac OS、Linux)、接口名称,甚至是您的语言环境配置如何:

ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d:

如果您有多个活动 IP,将在单独的行中列出每一个。如果您只想要第一个 IP,请添加| head -n1到表达式:

ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" \
     | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1

如果您想要特定接口的 IP 地址,请将第一个表达式替换ifconfigifconfig INTERFACENAME,例如ifconfig eth0 | grep -E ...

最后,您注意到脚本所做的其中一件事是省略127.0.0.1系统管理员和开发人员“localhost”调用的 IP,但要考虑到某些应用程序还可能添加具有 IP 的虚拟网络设备,如果是未添加到省略列表中,例如。docker0Docker 添加了一个通常具有 IP的虚拟接口172.17.0.1,如果您想省略此 IP 以及“localhost”,请更改表达式grep -v 127.0.0.1以考虑另一个 IP。在这种情况下(省略 localhost 和 docker),最终表达式将是:

ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v '[127.0|172.17].0.1' | awk '{ print $2 }' | cut -f2 -d: | head -n1

这些是本页中提到的在某些情况下失败的示例以及原因:

  • ip route ...:该ip命令未安装在 OSX 机器中。
  • hostname -I: 该-I选项在 OSX 中无效。
  • ifconfig en0 ...:接口名称(eth0, en0)在 Linux 和 OSX 中不同,在 Linux 中,名称还取决于接口类型(ethX表示以太网连接,wlanX表示无线等)。
  • python -c 'import socket; print(socket.gethostbyname(socket.gethostname()))':这让我在 Ubuntu Linux 14.04 中获得了127.0.1.1环回 IP),所以不起作用。
  • ifconfig | grep 'inet addr:' | grep -v 127.0.0.1 | head -n1 | cut -f2 -d: | cut -f1 -d ' ':Geograph 的帖子更接近,但在没有配置的情况下在某些 Linux 发行版中不起作用,LANG=en因为查找的文本在其他语言环境中以不同的文本输出,并且在 Mac OS 中该标签也不同。inet addr:grep
于 2016-05-13T14:29:14.553 回答
12

在 eth0 的情况下,以下对我有用。尝试用相同的逻辑对其进行调整。

ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'  
于 2014-05-29T13:49:34.723 回答
8

好吧,经过几个小时的努力,我终于做对了:

ifconfig en1 | awk '{ print $2}' | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"

我错过的最后一部分只是从我的列表中 grep 一个 IP 地址模式。

于 2014-05-29T15:24:21.020 回答
8

您可以像这样awk选择inet行和解析 IP 地址:

$ ip addr ls docker0 | awk '/inet / {print $2}' | cut -d"/" -f1
172.17.42.1

在上面的示例中,将设备句柄替换eth0docker0. 此外,如果你想要一个纯粹的AWK实现,你可以像这样进行“切割”:

$ ip addr ls docker0 | awk '/inet / {split($2, ary, /\//); print ary[1]}'
172.17.42.1
于 2014-09-06T13:06:49.523 回答
6

使用 BASH4+ 的 IPv4 示例

示例 1,使用主机名:

  hostname -I|cut -d" " -f 1

示例 2,设备是已知的(并且它永远不会改变):

  ifconfig ens5 | grep "inet" | awk '{print $2}' |  sed 's/[^0-9.]*//g'

示例 3,现在不要使用设备(例如 eth0、eth1、enp0s23 或 wpxxx):

 ip a | awk 'BEGIN{ "hostname -I|cut -d\" \" -f 1" | getline ip} $2 ~ ip {print "Device: "$NF "  IP: "$2}'

例4,要网络IP地址:

 wget -q -O /dev/stdout http://checkip.dyndns.org/ | cut -d":" -f2 | cut -d \< -f1

请享用。

于 2016-02-17T16:42:26.797 回答
3

除了解析 ifconfig 之外,还有另一种获取 IP 地址的简单方法。

hostname -I -I, --all-ip-addresses all addresses for the host -i, --ip-address addresses for the hostname

参考: http: //linux.die.net/man/1/hostname

例子:

[ec2-user@terraform ~]$ 主机名 -I
10.10.10.10

于 2015-12-18T16:46:14.440 回答
2

无需在 Bash 中进行不可移植的 ifconfig 解析。这是 Python 中一个微不足道的单行代码:

python -c 'import socket; print(socket.gethostbyname(socket.gethostname()))'
于 2014-05-29T13:36:23.287 回答
2

如果您正在寻找“inet”而不是“inet6”,这对我有用:

/usr/bin/ifconfig eth0 | grep --word-regexp inet | awk '{print $2}'

"--word-regexp" 将使 grep 查找整个单词 "inet" 而不是匹配部分单词,即 "inet" 不会匹配 "inet6" - "inet" 只会匹配其中包含 "inet" 的行.

于 2015-02-23T21:26:43.940 回答
2

你也可以试试这个

user@linux:~$ cat script.sh
ifconfig | grep ad.*Bc | cut -d: -f2 | awk '{ print $1}'
user@linux:~$ 

输出

user@linux:~$ ./script.sh
192.168.1.1
10.0.1.1
user@linux:~$

请注意,ifconfig 输出可能会因您的 linux 版本而异。因此,您可能需要相应地更改脚本。

顺便说一句,这是我的 ifconfig 输出

user@linux:~$ ifconfig 
eth0      Link encap:Ethernet  HWaddr 00:00:00:00:00:10  
          inet addr:192.168.1.1  Bcast:192.168.56.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:112 errors:0 dropped:0 overruns:0 frame:0
          TX packets:93 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:14616 (14.2 KiB)  TX bytes:17776 (17.3 KiB)

eth1      Link encap:Ethernet  HWaddr 00:00:00:00:00:11
          inet addr:10.0.1.1  Bcast:10.0.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

user@linux:~$
于 2017-06-14T13:52:44.120 回答
0

与 JSR 类似,但awk顺序cut相反:

my_ip=$(ifconfig en1 | grep 'inet addr' | awk '{print $2}' | cut -d: -f 2)
echo ${my_ip}
于 2015-08-08T00:41:48.793 回答
0

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

于 2015-09-01T14:21:55.907 回答
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 ' '
于 2015-10-18T06:10:33.273 回答
0

采取补丁的答案,使其更笼统,

即:跳过所有内容直到第一个数字。

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

甚至更好:

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

  • 请注意最后的打印部分 - 从$2更改为$1

使用 Perl 正则表达式:

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

说明: grep -oP 使用 Perl 正则表达式搜索精确匹配。
“棘手”的部分是正则表达式本身;
1. (?<= inet addr:)表示 - 字符串inet addr:在我们要查找的内容的左侧。
2. [^ ]+ (请注意 ^ 后面的空格) - 这意味着查找所有内容,直到第一个空白 - 在我们的例子中是 IP 地址。

于 2015-11-03T08:15:13.163 回答
0

利用:

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

enops3接口名称在哪里。

于 2015-11-07T10:51:03.213 回答
0

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

它对于在以下机器上运行的脚本特别有用:

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

脚本是:

/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 的结果 - 所以它是为了便携性而保留的。
于 2016-01-03T00:14:44.870 回答
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

于 2016-03-29T08:49:47.083 回答
0

在遇到 greping 问题后,ifconfig我找到了一个包装库来简化我的生活

pip install my_ip 
mip
于 2020-06-29T11:42:04.007 回答
-1
ifconfig eth0 | awk '/inet addr/{sub("addr:",""); print $2}'
于 2015-10-23T22:07:15.680 回答
-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 ""
        }
    }
}'
于 2016-01-23T00:11:20.320 回答