我正在更新我的 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
它来组合grep
和cut
功能:
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 条目的方法)。