Linux bash脚本提取IP地址

时间:2014-01-24 15:16:10

标签: linux bash sed awk

我想在我的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“你的IP地址是:(IP_ADDRESS)”。是否有任何命令允许我做这样的事情,在流中搜索我想要得到的信息?我知道grepsed,但我对他们并不擅长。

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

13 个答案:

答案 0 :(得分:80)

如果目标是找到互联网方向连接的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

所以要获得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

找到使用的IP和接口:

ip route get 8.8.8.8
8.8.8.8 via 10.10.10.1 dev eno1 src 192.168.3.33
    cache

然后提取IP:

ip route get 8.8.8.8 | awk 'NR==1 {print $NF}'
192.168.3.33

ip route没有打开任何连接,它只显示了到达8.8.8.8所需的路线。 8.8.8.8是Google的DNS。


为什么其他解决方案可能会失败:

ifconfig eth0

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

Hostname -I

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

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

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]}')

答案 1 :(得分:35)

只需获取您的IP地址:

echo `ifconfig eth0 2>/dev/null|awk '/inet addr:/ {print $2}'|sed 's/addr://'`

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

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

hostname --all-ip-addresseshostname -I,它执行相同的操作(为您提供主机的所有IP地址)。

答案 2 :(得分:34)

如果您想获得以空格分隔的IP列表,可以使用hostname命令和--all-ip-addresses(短-I)标记

hostname -I

如下所述:Putting IP Address into bash variable. Is there a better way

答案 3 :(得分:7)

ip -4 addr show eth0 | grep -oP "(?<=inet ).*(?=/)"

答案 4 :(得分:4)

选择:

$ cat file
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

$ awk 'sub(/inet addr:/,""){print $1}' file
192.168.1.103

$ awk -F'[ :]+' '/inet addr/{print $4}' file
192.168.1.103

答案 5 :(得分:4)

  /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'

答案 6 :(得分:4)

可能并非适用于所有情况(特别是如果你有几个NIC),这将有所帮助:

hostname -I | awk '{ print $1 }'

答案 7 :(得分:3)

ip route get 8.8.8.8| grep src| sed 's/.*src \(.*\)$/\1/g'

答案 8 :(得分:2)

请注意,因为我花了一些时间来解决服务器上的拙劣升级问题。 事实证明,(多年前)我已经实施了一项测试,看看是否存在动态添加的接口(例如eth0:1),如果存在,我会将某些proggis绑定到eth0上的'main'IP。基本上它是'ifconfig | grep ... | sed ...'解决方案的变体(加上检查'eth0:'存在)。
升级带来了新的网络工具,随之而来的输出略有改变:

旧的ifconfig:

eth0      Link encap:Ethernet  HWaddr 42:01:0A:F0:B0:1D
          inet addr:10.240.176.29  Bcast:10.240.176.29  Mask:255.255.255.255
          UP BROADCAST RUNNING MULTICAST  MTU:1460  Metric:1
          ...<SNIP>

而新版本将显示:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1460
      inet 10.240.212.165  netmask 255.255.255.255  broadcast 10.240.212.165
      ...<SNIP>

渲染'eth0:'以及'inet addr:'搜索被破坏(更不用说'em0','br0'或'wlan0'......)。当然你可以检查'inet'(或'inet6'),并使addr:part可选,但仔细观察,你会发现或多或少的一切都发生了变化,'Mask'现在是'netmask',..

'ip route ...'建议非常漂亮 - 所以也许吧:

_MyIP="$( ip route get 8.8.8.8 | awk 'NR==1 {print $NF}' )"
if [ "A$_MyIP" == "A" ]
then
    _MyIPs="$( hostname -I )"
    for _MyIP in "$_MyIPs"
    do
        echo "Found IP: \"$_MyIP\""
    done
else
    echo "Found IP: $_MyIP"
fi

嗯,无论如何都是那样的。由于所有提议的解决方案似乎都存在失败的情况,因此请检查可能的边缘情况 - 没有eth,多个eth&amp; lo,什么时候'主机名-i'会失败,......然后决定最佳解决方案,检查它是否有效,否则排在第二位。

干杯'啤酒!

答案 9 :(得分:0)

在我看来,实现您所需要的最简单,最优雅的方式是:

namespace App\Controllers;

use DDesrosiers\SilexAnnotations\Annotations as SLX;
use Silex\Application;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use R; // <-- Notice this

/**
 * @SLX\Controller(prefix="article")
 */
class ArticleController
{
    // Use: R::findAll('article') in any method in this class
}

PHP - 为您提供用于访问远程主机的网关,例如:

@Remote
public interface PlayerServiceRemote {

ip route get 8.8.8.8 | tr -s ' ' | cut -d' ' -f7 - 删除任何多余的空格,现在你有一致性,例如:

ip route get [host]

8.8.8.8 via 192.168.0.1 dev enp0s3 src 192.168.0.109 - 将字符串截断为&#39; &#39;空格分隔的字段,然后从中选择字段#7,例如:

tr -s ' '

答案 10 :(得分:0)

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

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

答案 11 :(得分:0)

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

答案 12 :(得分:0)

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

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