使用grep通过adb shell提取IP

使用grep通过adb shell提取IP

我正在尝试创建一个单行、独立于平台的解决方案,用于使用adb shelland 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本地之类的东西。


或者,忘记像grepand这样的传统工具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

相关内容