我正在尝试创建一个单行、独立于平台的解决方案,用于使用adb shell
and grep
(我的 Android 设备上的内部 grep)查找 Android 设备的本地 IP 地址。我有一个可行的解决方案,但有些事情一直困扰着我。
顺便说一句,我正在 Powershell 7 中运行我的解决方案,如果这有什么区别的话。
这是我的解决方案:
> adb shell "ip addr show wlan0 | grep -e 'inet[^6]'"
inet 192.168.0.19/22 brd 192.168.3.255 scope global wlan0
它有效,但我不能用作\d
字符类来过滤,这会更好。
我首选的解决方案将仅显示 IP 地址,而不显示其他内容。这是我能做的最好的事情:
> adb shell "ip addr show wlan0 | grep -o '^ inet [0-9][0-9][0-9].[0-9][0-9][0-9].[0-9]'"
inet 192.168.0
Android 似乎附带了有限的终端设置,并使用“toybox”来模拟典型的 bash 工具。但它们似乎相当有限,并且没有提供太多文档。
由于我无法使用数字字符类或量词,因此我只能过滤该行,并且 using-o
是输出信息的唯一方法。因此,我首选的解决方案实际上是不可能实现的。
我该如何使用这个有限的工具集提取我的本地 IP 地址?
答案1
您可以只在本地运行grep
而不是作为adb
表达式的一部分:
$ adb shell "ip addr show wlan0" |
grep -o -P '^ *inet \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'
inet 192.168.1.167
那里的选项-P
意味着--perl-regexp
, 并且是支持\d
转义所必需的。
awk
您也可以仅使用和的组合cut
:
$ adb shell "ip addr show wlan0 | awk '\$1 == \"inet\" {print \$2}' | cut -f1 -d/"
192.168.1.167
那里有一堆转义符,以防止本地 shell 扩展$1
本地之类的东西。
或者,忘记像grep
and这样的传统工具awk
,使用 JSON and 来完成它jq
:
$ adb shell "ip -j addr show wlan0" | jq -r '.[]|select(.ifname).addr_info[]|select(.family=="inet").local'
192.168.1.167