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

Fer*_*imo 15 macos bash awk ifconfig

我想编辑bashrc文件,以便运行一个名为"myip"的简单函数.正如您可能猜到的,函数myip只打印我机器的内部IP地址.

我工作的时候,这是脚本:

ifconfig en1 | awk '{ print $2}' | sort
Run Code Online (Sandbox Code Playgroud)

这得到了我的输出:

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
Run Code Online (Sandbox Code Playgroud)

我正在使用Mac OS X.

我怎么能这样做?

Eta*_*ner 24

以下两项工作(CentOS 5).

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

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

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

ifconfig en0 | awk '$1 == "inet" {print $2}'
Run Code Online (Sandbox Code Playgroud)


Mar*_*uiz 15

这是获取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:
Run Code Online (Sandbox Code Playgroud)

如果您有多个活动IP,则会将每个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
Run Code Online (Sandbox Code Playgroud)

如果你想要一个特定的接口的IP地址,更换一次表达ifconfigifconfig INTERFACENAME,例如ifconfig eth0 | grep -E ....

这些是本页中提到的一些示例,在某些情况下会失败,原因如下:

  • ip route ...:该ip命令未安装在OSX计算机中.
  • hostname -I:-IOSX中的选项无效.
  • 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配置,因为文字inet addr:grep寻找与其他区域设置不同的文本输出,并在Mac OS中该标签也不同.


JSR*_*JSR 12

在eth0的情况下,以下适用于我.尝试用相同的逻辑调整它.

ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'  
Run Code Online (Sandbox Code Playgroud)

  • 由于我是恐怖的,我的版本略有不同:`ifconfig eth0 | grep"inet\addr"| cut -d:-f2 | cut -d"" - f1` (5认同)

Fer*_*imo 8

好吧,经过数小时的挣扎,我终于做对了:

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

我遗漏的最后一部分只是从我的列表中看到一个IP地址模式.

  • 这也将为您做到这一点: ifconfig en1|awk '/inet / {print $2}' (2认同)

slm*_*slm 7

您可以使用awk选择inet行和解析IP地址,如下所示:

$ ip addr ls docker0 | awk '/inet / {print $2}' | cut -d"/" -f1
172.17.42.1
Run Code Online (Sandbox Code Playgroud)

另外,在上述的例子中,替换装置处理eth0docker0.此外,如果你想要一个纯粹的AWK实现,你可以像这样进行"切割":

$ ip addr ls docker0 | awk '/inet / {split($2, ary, /\//); print ary[1]}'
172.17.42.1
Run Code Online (Sandbox Code Playgroud)


Mik*_*e Q 5

使用 BASH4+ 的 IPv4 示例

示例 1,使用主机名:

  hostname -I|cut -d" " -f 1
Run Code Online (Sandbox Code Playgroud)

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

  ifconfig ens5 | grep "inet" | awk '{print $2}' |  sed 's/[^0-9.]*//g'
Run Code Online (Sandbox Code Playgroud)

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

 ip a | awk 'BEGIN{ "hostname -I|cut -d\" \" -f 1" | getline ip} $2 ~ ip {print "Device: "$NF "  IP: "$2}'
Run Code Online (Sandbox Code Playgroud)

例4,想要网络IP地址:

 wget -q -O /dev/stdout http://checkip.dyndns.org/ | cut -d":" -f2 | cut -d \< -f1
Run Code Online (Sandbox Code Playgroud)

请享用。