从 ifconfig 获取 ip 地址

从 ifconfig 获取 ip 地址

我正在更新我的 shell dot 文件,我认为有一个只显示我的 ip 的别名会很好。我通常使用 wifi 连接,它位于 wlan0 上,是最后一个“设备块”。

所以我有这样的事情:

wlan0     Link encap:Ethernet  HWaddr 6c:71:d9:d3:28:9d  
          inet addr:192.168.1.16  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::6e71:d9ff:fed3:289d/64 Scope:Link

我想要我的广播地址。

通过这个命令我可以得到它:

alias ip="ifconfig | grep Bcast | tail -n1 | cut -d' ' -f14 | cut -d':' -f2"

但我不喜欢这样。有没有更干净的方法呢?

答案1

如果您确定那wlan0是接口,那么您可以使用以下命令仅返回此接口的信息:

ifconfig wlan0

现在您只有一行Bcast:(消除tail),您可以使用sed它来组合grepcut功能:

ifconfig wlan0 | sed -n 's/^.*Bcast:\(.*\) .*$/\1/p'

在这种情况下,sed -n消除了从输入中打印行的常规操作,并且搜索字符串匹配整行,同时标记位于Bcast:和下一个空格之间的内容:替换仅是这个标记字段,并/p覆盖-n和强制打印。请注意,要将此字符串分配给别名,您需要使用双引号并使用反斜杠转义某些字符,或者使用单引号,将上述命令中的那些替换为'\''(尽管您可以省略最终的结果'')。

最后,如果您想确保这wlan0是您想要的接口,并且没有其他配置用于互联网访问的接口,那么您可以找出正在使用的接口(您可能需要安装networkctl):

networkctl status | sed -n 's/^.*Gateway: .* on \(.*$\)/\1/p'

这与之前类似地使用sed输出networkctl。现在你可以将它们组合起来:

ifconfig $(networkctl status |\
  sed -n 's/^.*Gateway: .* on \(.*$\)/\1/p')|sed -n 's/^.*Bcast:\(.*\) .*$/\1/p'

这很难说是简洁,但它涵盖了大部分基础 - 特别是,如果您的无线网络无法使用,而您改用以太网,它应该仍然可以使用。如果您让两个接口一起工作,情况会变得更加复杂:我留给您自己解决(提示:您需要用作命令/Gateway/,$的线路范围s,以及排除 IPv6 条目的方法)。

相关内容