Answers:
将其保存在文件中,然后运行 bash <filename>
#!/bin/bash
ifconfig eth0 | grep "inet addr"
更准确地获取仅显示IP地址的数字:
#!/bin/bash
ifconfig eth0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1
更新:如果这不适用于您,请尝试其他答案
grep "inet"
为了提供另一个选项,您可以通过ip addr
以下方式使用该命令来获取IP地址:
ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
ip addr show eth0
显示有关的信息 eth0
grep "inet\b"
仅显示具有IPv4地址的行(如果您需要IPv6地址,请将其更改为"inet6\b"
)awk '{print $2}'
在第二个字段上打印,该字段具有ipaddress / mask,例如 172.20.20.15/25
cut -d/ -f1
仅占用IP地址部分。在脚本中:
#!/bin/bash
theIPaddress=$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)
取自/programming//a/14910952/1695680
hostname -i
但是,这可能会返回本地ip地址(127.0.0.1),因此您可能必须使用和过滤:
hostname -I
从主机名的联机帮助页:
-i, --ip-address
显示主机名的网络地址。请注意,这仅在主机名可以解析的情况下有效。避免使用此选项;请改用主机名--all-ip-addresses。
-I, --all-ip-addresses
显示主机的所有网络地址。此选项枚举所有网络接口上的所有已配置地址。省略了环回接口和IPv6链接本地地址。与选项-i相反,此选项不依赖于名称解析。不要对输出的顺序做任何假设。
ip addr show label 'enp*'
ip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2
@ markus-lindberg的回复是我的最爱。如果添加-o -4
到ip的标志,那么您将获得更容易解析(一致)的输出:
ip -o -4 a | awk '$2 == "eth0" { gsub(/\/.*/, "", $4); print $4 }'
-o
代表--oneline
,其目的是在这种情况下提供帮助。将-4
被添加到限制的IPv4地址,这是所有其他答复暗示。
ip
旗帜。使用cut
而不是高级的awk
巫术:ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
cut
之后,便“发现”了方式awk
,并且我希望最大限度地减少管道上的命令数量。无论如何都不错的建议。
这是一些班轮.....
Awk
ifconfig eth0 | awk '/inet addr/{split($2,a,":"); print a[2]}'
上面awk命令中的split函数基于定界符对第二列进行拆分,并将拆分后的:
值存储到关联数组中a
。因此a[2]
持有第二部分的价值。
sed
ifconfig eth0 | sed -n '/inet addr/s/.*inet addr: *\([^[:space:]]\+\).*/\1/p'
在基本sed中,\(...\)
称为捕获组,用于捕获字符。我们可以通过反向引用来引用那些捕获的字符。\([^[:space:]]\+\)
捕获任何字符,但不捕获空格一次或多次。
grep
ifconfig eth0 | grep -oP 'inet addr:\K\S+'
\K
从最后打印时丢弃先前匹配的字符,并\S+
匹配一个或多个非空格字符。
佩尔
ifconfig eth0 | perl -lane 'print $1 if /inet addr:(\S+)/'
inet addr:
捕获字符串旁边的一个或多个非空格字符,最后我们仅打印那些捕获的字符。
您应该使用ip
(而不是ifconfig
),因为它是当前的,已维护的,并且也许最重要的是出于脚本目的,它会产生一致且可解析的输出。以下是一些类似的方法:
如果您想要以太网接口的IPv4地址eth0
:
$ ip -4 -o addr show eth0 | awk '{print $4}'
192.168.1.166/24
作为脚本:
$ INTFC=eth0
$ MYIPV4=$(ip -4 -o addr show $INTFC | awk '{print $4}')
$ echo $MYIPV4
192.168.1.166/24
上面产生的输出采用CIDR表示法。如果不需要CIDR表示法,可以将其删除:
$ ip -4 -o addr show eth0 | awk '{print $4}' | cut -d "/" -f 1
192.168.1.166
IMHO是“最优雅的”的另一个选项是获取用于连接到指定远程主机的任何接口的IPv4地址(在这种情况下为8.8.8.8)。由@gatoatigrado提供此答案:
$ ip route get 8.8.8.8 | awk '{ print $NF; exit }'
192.168.1.166
作为脚本:
$ RHOST=8.8.8.8
$ MYIP=$(ip route get $RHOST | awk '{ print $NF; exit }')
$ echo $MYIP
192.168.1.166
这在具有单个接口的主机上可以很好地工作,但是更有利的是,在具有多个接口和/或路由规范的主机上也可以工作。
虽然ip
这是我的首选方法,但它肯定不是给这只猫剥皮的唯一方法。hostname
如果您希望更简单/更简洁的方法,这是另一种使用的方法:
$ hostname --all-ip-addresses | awk '{print $1}'
或者,如果您想要IPv6地址:
$ hostname --all-ip-addresses | awk '{print $2}'
作为脚本:
$ MYV4IP=$(hostname --all-ip-addresses | awk '{print $1}')
$ MYV6IP=$(hostname --all-ip-addresses | awk '{print $2}')
$ echo $MYV4IP
192.168.1.166
$ echo $MYV6IP
2601:7c1:103:b27:352e:e151:c7d8:3379
我建议使用专门为该目的而设计的python库(如netifaces)。
sudo pip install netifaces
python -c "import netifaces; print netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr']"
获取正在使用的默认网络接口。
default_inf = netifaces.gateways()['default'][netifaces.AF_INET][1]
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'
这仅使用ip addr
其是用于替换ifconfig
和awk
与取代(GSUB)相结合。
ifconfig eth0|grep 'inet '|awk '{print $2}'
普通用户也可以使用。
ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
cut
的,而不是一个组合两次awk
,并cut
解析输出。下次您最好先检查所有其他答案,并确保不要发布重复的解决方案。在这种情况下,我认为它是重复的还是相似的还是有争议的,因此请把它作为一般提示。谢谢。
在这些日子里,使用多个接口(例如,如果您使用泊坞窗),并且以ETH命名接口已不再是规范
我使用此命令提取IP /掩码:
IPMASK=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6)
因此,无论我将拥有多少个接口以及它们的名称如何,GREP只会抢先拥有MULTICAST选项的接口。
我使用此命令仅提取不带掩码的IP:
IP=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6|cut -d'/' -f1)
我在不同的BDS和NIX上使用这些命令,它永远不会失败;)
ip
,请使用-o
选项。
在我的脚本中,我使用的是这样的:
re="inet[[:space:]]+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)"
if [[ $(ip addr show eth0) =~ $re ]]; then
echo ${BASH_REMATCH[1]}
else
echo "Cannot determin IP" 1>&2
fi
它不会产生任何进程。