Linux bash脚本提取IP地址

use*_*381 35 linux bash awk sed

我想在我的Debian 7.3上制作大脚本(类似翻译的内容和更多新的用户友好环境).我有个问题.我只想使用命令给我的一些信息.例如,我的ifconfig看起来像:

eth0      Link encap:Ethernet  HWaddr 08:00:27:a3:e3:b0  
          inet addr:192.168.1.103  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fea3:e3b0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1904 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2002 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1309425 (1.2 MiB)  T
Run Code Online (Sandbox Code Playgroud)

我想只显示IP地址:echo"你的IP地址是:(IP_ADDRESS)".是否有任何命令允许我做这样的事情,在流中搜索我想要得到的信息?我知道grep,sed但我对他们并不是很好.

编辑:首先要感谢您帮我解决这个问题,现在我知道了更多.其次说项目正在进行中.如果有人对它感兴趣,请关注我.

Jot*_*tne 81

如果目标是找到在互联网方向上连接的IP地址,那么这应该是一个很好的解决方案.


UPDATE!使用新版本的linux,您可以获得更多有关该行的信息:

ip route get 8.8.8.8
8.8.8.8 via 10.36.15.1 dev ens160 src 10.36.15.150 uid 1002
    cache
Run Code Online (Sandbox Code Playgroud)

所以要获得IP,你需要在src之后找到IP

ip route get 8.8.8.8 | awk -F"src " 'NR==1{split($2,a," ");print a[1]}'
10.36.15.150
Run Code Online (Sandbox Code Playgroud)

找到使用的IP和接口:

ip route get 8.8.8.8 | awk -F"dev " 'NR==1{split($2,a," ");print a[1]}'
ens192
Run Code Online (Sandbox Code Playgroud)

然后提取IP:

my_ip=$(ip route get 8.8.8.8 | awk -F"src " 'NR==1{split($2,a," ");print a[1]}')

my_interface=$(ip route get 8.8.8.8 | awk -F"dev " 'NR==1{split($2,a," ");print a[1]}')
Run Code Online (Sandbox Code Playgroud)

ip route没有打开任何连接,它只显示到达的路线8.8.8.8.8.8.8.8是谷歌的DNS.


为何其他解决方案可能失败

ifconfig eth0

  • 如果你有的接口有另一个名称(eno1,wifi,venet0等)
  • 如果您有多个界面
  • IP连接方向不是多个IF列表中的第一个

Hostname -I

  • 可能只获得127.0.1.1
  • 不适用于所有系统.

如果您想将其存储到变量中,请执行以下操作:

ip route get 8.8.8.8
8.8.8.8 via 10.36.15.1 dev ens160 src 10.36.15.150 uid 1002
    cache
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的解决方案,好像不依赖于先验地知道接口名称.如果接口名称更改,脚本将不会中断.此外,请注意,如果您有不同的子网/ WAN /等接口,您可以通过更换8.8.8.8来选择正确的IP(只需使用您知道的网络上所需的IP). (3认同)

Mar*_*erg 35

要获取您的IP地址:

echo `ifconfig eth0 2>/dev/null|awk '/inet addr:/ {print $2}'|sed 's/addr://'`
Run Code Online (Sandbox Code Playgroud)

这将为您提供eth0的IP地址.

编辑:由于最近版本的Ubuntu中接口的名称更改,这不再起作用.相反,你可以使用这个:

hostname --all-ip-addresses或者hostname -I,它做同样的事情(给你主机的所有IP地址).

  • 你不应该使用旧的tics,使用括号`$(code)`.如果IF不是eth0,它也将失败.这可以写得更像这样:`ifconfig eth0 | awk -F"[:] +"'/ inet addr:/ {print $ 4}'` (6认同)
  • `echo`什么都不做.你也永远不需要`sed`和'awk`因为awk可以做任何事情都可以做. (5认同)
  • 考虑使用`hostname -I`.根据@ DanilaV.的评论.现在NIC的命名可能不是ethX,许多版本的linux已经开始使用**em**来为接口添加前缀. (5认同)

use*_*001 35

如果要获取以空格分隔的IP列表,可以使用hostname带有--all-ip-addresses(short -I)标志的命令

hostname -I
Run Code Online (Sandbox Code Playgroud)

如下所述:将IP地址放入bash变量中.有更好的方法吗?

  • @Jotne如果你有多个IP,你可以将输出剪切到你想要的IP(例如第一个),如下所示:`hostname -I | cut -f1 -d' '`,尽管我同意如果接口的顺序可以改变,使用 ip 工具会更好 (2认同)
  • 喜欢它 - 假设只有一个地址这是完美的!这是通过"ip"ip addr |获取它的另一种粗略和准备好的方法 grep"范围全球"| sed's:^ [^ 0-9]*::'| sed's:/.*$ ::' (2认同)

小智 8

ip -4 addr show eth0 | grep -oP "(?<=inet ).*(?=/)"
Run Code Online (Sandbox Code Playgroud)


fas*_*aan 6

ip route get 8.8.8.8| grep src| sed 's/.*src \(.* \)/\1/g'|cut -f1 -d ' '
Run Code Online (Sandbox Code Playgroud)

  • 感谢您发布此问题的答案!Stack Overflow 上不鼓励仅提供代码答案,因为原始发布者(或未来的读者)可能很难理解其背后的逻辑。请编辑您的问题并包含对代码的解释,以便其他人可以从您的答案中受益。谢谢! (2认同)

Pav*_*vel 5

可能不适用于所有情况(尤其是如果您有多个NIC),这将有所帮助:

hostname -I | awk '{ print $1 }'
Run Code Online (Sandbox Code Playgroud)

  • `hostname -I` 正如 man 所说 =&gt; “不要对输出的顺序做出任何假设。” (2认同)