Linux脚本提取IP地址

50

我希望在我的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

我想在这一行中仅显示IP地址: echo "Your IP address is: (IP_ADDRESS)"。是否有任何命令可以让我做到这一点,以便在流中搜索我想要获取的信息?我知道grep和sed,但我不是很擅长使用。

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


1
还要查看bash手册中的管道文档。 - Alex Brown
3
你所尝试做的事情存在一个根本性问题:机器通常会有多个IP地址(有一个用于有线连接,一个用于无线连接,一个用于虚拟机连接等)。你需要考虑要选择哪一个。 - James Kingsbery
@JamesKingsbery 我没有考虑到这一点。我稍后会考虑一下。谢谢你给我展示下一个问题。PS:谢谢你给我发送grep命令的参考手册。它真的帮了我很多。 - user3232381
15个回答

1

对之前的一个ip route ...解决方案进行了轻微修改,消除了对grep的需求:

ip route get 8.8.8.8 | sed -n 's|^.*src \(.*\)$|\1|gp'

我的Ubuntu 20.04系统在IP后面有其他内容,因此这个优雅的解决方案并不能完全隔离出IP。示例输出如下:192.168.9.9 uid 0。 - Ian D. Allen

1
一种对先前的一个 ip route ... 解决方案略作修改的方法,它仅使用 ipsed,并正确地隔离出 IPv4 IP。
ip -4 route get 1.1.1.1 | sed -n 's/^.*src \([0-9.]*\).*$/\1/p'

1

如果您只想使用sed提取IP地址:

ifconfig eth0 2>/dev/null sed -n 's/.*[[:space:]]\([[:digit:]][[:digit:]]*\.[[:digit:]][[:digit:]]*\.[[:digit:]][[:digit:]]*\.[[:digit:]][[:digit:]]*\).*/\1/p'

0
awk '/inet addr:/{gsub(/^.{5}/,"",$2); print $2}' file
192.168.1.103

0
假设您已经安装了jq,并且您的接口名称是eth0,我发现这是我尝试过的许多方法中最干净的一个:
ip -4 -br -j addr show dev eth0 | jq -r '.[0].addr_info[0].local'

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