【问题标题】:Printing the IP and device name only in linux仅在 linux 中打印 IP 和设备名称
【发布时间】:2014-05-10 08:16:45
【问题描述】:

我想显示设备名称和 IP。谁能知道我如何提取这个?

ifconfig -a 

eth0      Link encap:Ethernet  HWaddr 10:60:4b:db:60:86  
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr: 1.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:1366 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1366 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:245049 (245.0 KB)  TX bytes:245049 (245.0 KB)

【问题讨论】:

标签: linux sed


【解决方案1】:

我可以提议吗:

ifconfig -a | tr '\n' '~' | sed 's/~~/\n/g' | \
sed 's/^\([^ ]*\) .*inet addr:\([0-9.]*\) .*$\|^\([^ ]*\) .*$/\3\1 \2/g'

输出:

eth0 10.0.41.21
eth1 
lo 127.0.0.1

或者,如果您想省略任何没有 IP 地址的接口:

ifconfig -a | tr '\n' '~' | sed 's/~~/\n/g' | grep 'inet addr:' | \
sed 's/^\([^ ]*\) .*inet addr:\([0-9.]*\) .*$/\1 \2/g'

输出:

eth0 10.0.41.21
lo 127.0.0.1

这通过将所有换行符转换为波浪号来工作,然后将接口之间的双换行符转换回单换行符,以便每个接口都在一行上。然后,对于每一行,它只提取所需的信息片段(接口名称和 IP 地址)并用它们替换整行。

(根据下面的评论,在被接受以容纳没有 IP 地址的接口后进行了编辑。)

【讨论】:

  • @AvinashRaj 你具体看到了什么?在 Debian 7.3 上对我来说效果很好。 (不适用于 BSD 或 OS X,因为 ifconfig 不会在接口之间产生 \n\n。)
  • 它在 ubuntu 14.04 的接口之间产生双新行
  • @CameronKerr 行首没有标签,但即使有,它仍然可以工作。
  • @AvinashRaj 刚刚将其复制并粘贴到 Ubuntu 14.04 中。如所述显示。具体是什么“不起作用”?你看到了什么?
  • @AvinashRaj 好的,我知道发生了什么:它适用于具有 IP 地址的接口(例如 usb0 192.168.42.235),但它也会打印出任何没有接口的所有信息IP地址。我会重新装备。
【解决方案2】:

这是迄今为止我找到的获得 IP 的最佳方式。

IP=$(ip route get 8.8.8.8 | awk '/8.8.8.8/ {print $NF}')
echo "$IP"
192.168.1.102

获取接口

IF=$(ip route get 8.8.8.8 | awk '/8.8.8.8/ {print $5}')
echo "$IF"
eth0

之所以这样运行良好,是因为它为您提供了 IP 和接口。
VPS 服务器接口上的名称可能类似于veth0
此解决方案通过询问在哪里可以找到到公共 IP 的路由来获得正确的接口。
您可以使用 8.8.8.8 (googles dns) 以外的其他名称,但对于大多数人来说这应该没问题。

如果您只查找 eth0 并且您正在使用 eth1 等,则使用 ifconfig 将失败。
如果多个接口有IP并连接,但只有一个用于上网,则可能会失败。

【讨论】:

    【解决方案3】:

    你的命令根本不适合我。

    仅仅因为 IP 地址与设备名称不在同一行 - 这并不容易。您将需要组合一些额外的命令,或者可能会编写一个小脚本。

    要只查看 IP 地址,您可以使用它:

    ifconfig -a | grep "inet 添加" | awk -F ":" {'print $2'} | awk {'打印 $1'}

    检查您的 linux 机器上是否安装了“nm-tool”,并弄清楚如何将此命令与其他 sed 和 awk 工具一起使用,以找出您需要的东西。

    【讨论】:

    • 嗨,我也想用 ip 打印设备名称
    • 如果你只有一个接口,使用这个:ifconfig | grep eth0 | awk {'打印 $1'} ;如果配置 | awk "NR==2"| awk -F ":" {'print $2'} | awk {'print $1'}
    • 希望对您有所帮助
    • ifconfig -a | sed 's/[ \t].*//;/^$/d' 这个命令对我有用。但这只显示设备名称。我也想打印设备的所有 ip。
    【解决方案4】:

    请试试这个: 请保存为 somefile.py 并通过 python somefile.py 运行

    import commands
    
    output=commands.getoutput('ifconfig')
    count=0
    for line in output.split("\n"):
            count+=1
            if  str("eth") in line:
                    devicename = line.split()[0]
                    lineipadd =  output.split("\n")[count]
                    ipaddress = lineipadd.split(":")[2].split()[0]
                    print devicename , ipaddress
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-13
      • 2015-12-26
      • 2020-05-22
      • 2011-11-27
      • 1970-01-01
      • 2022-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多