在 Android 命令上使用 awk

在 Android 命令上使用 awk

我有一个Android命令,其输出如下:

$adb shell "head -20 /d/dma_buf/bufinfo"

Dma-buf Objects:
size            flags           mode            count           exp_name        buf name
00020480        00000002        00000007        00000003        ion-system-660-vendor.qti.hard  dmabuf210
        Attached Devices:
Total 0 devices attached

09469952        00000002        00000007        00000003        ion-system-660-vendor.qti.hard  dmabuf209
        Attached Devices:
        kgsl-3d0
Total 1 devices attached

00020480        00000002        00000007        00000003        ion-system-660-vendor.qti.hard  dmabuf208
        Attached Devices:
Total 0 devices attached

09469952        00000002        00000007        00000003        ion-system-660-vendor.qti.hard  dmabuf207
        Attached Devices:
        kgsl-3d0
Total 1 devices attached

文件中也有类似的条目。现在我想要的是从 exp_name 字段中提取 pid(内核无法访问大于 16 字节的完整名称),并使用ps pid -o comm=cf.ps从 ps 输出中获取该进程的完整名称。 [1] 并将其与$1awk 输出一起打印。我被困在如何检索它。我从以下命令开始

$adb shell "sed -n '/dmabuf/p' /d/dma_buf/bufinfo|head -10"|awk '
BEGIN { touch temp} {echo $5 > temp; pid = $(cut -d '-' -f 3,3 temp);}
END { rm temp}
'

但这会产生语法错误,如下所示:

awk: cmd. line:2: BEGIN { touch temp} {echo $5 > temp; pid = $(cut -d - -f 3,3 temp);}
awk: cmd. line:2:                                                           ^ syntax error

[1] Android awk 存在问题,因此我求助于主机 Linux 机器的实用程序。

$adb shell "awk '/dmabuf/{print}' /d/dma_buf/bufinfo|head -3"
00020480        00000002        00000007        00000003        ion-system-660-vendor.qti.hard  dmabuf210
09469952        00000002        00000007        00000003        ion-system-660-vendor.qti.hard  dmabuf209
00020480        00000002        00000007        00000003        ion-system-660-vendor.qti.hard  dmabuf208

adb shell "awk '/dmabuf/{print NF}' /d/dma_buf/bufinfo|head -3"
6
6
6

所以这个输出有 6 个字段(用制表符分隔)。然而,当我尝试打印各个字段时,它并没有这样做,仍然打印整行。

$adb shell "awk '/dmabuf/{print $4}' /d/dma_buf/bufinfo|head -3"
00020480        00000002        00000007        00000003        ion-system-660-vendor.qti.hard  dmabuf210
09469952        00000002        00000007        00000003        ion-system-660-vendor.qti.hard  dmabuf209
00020480        00000002        00000007        00000003        ion-system-660-vendor.qti.hard  dmabuf208

答案1

我可以使用以下命令提取pids:

$ awk 'NF == 6 {print $5}' inputfile | grep -Eo '[0-9]+'
660
660
660
660

由于 Android 使用procfs,您可以将实际的二进制文件视为/proc/$pid/exe.但是,由于这是一个不遵守正常 POSIX 规则的神奇(即procfs)符号链接,因此您无法使用更常见的方法来查找其目标。但是,您可以使用stat

$ stat -c '%N' /proc/$$/exe
`/proc/4811/exe' -> `/system/bin/sh'
[...]

答案2

line # 特定文件信息提取的规范。以及语法模式|操作规则。 awk 是连续的单行脚本,尽管已包装。只需编写$从 gawk 获取的系统信息代码的 a 和 #1-16。也许可以在 Playstore 上获取指南并习惯它。它是一种优秀的脚本语言。 awk 是开源的,如果您想重命名 #,您可以随时更改代码以满足您的信息需求。

$0 = all
$1 = 1st field
$2 = 2nd field
etc.,
$NF =the last field

现在您需要操作,因此请输入 a|并指定您想要从花括号中的哪些字段以及单引号中的整个内容中获取哪些信息...idk 关于 include ---BEGIN。 awk 在 android 上不需要它,,,但我的手机上可能有比我意识到的更多的权限..祝你好运,我喜欢 awk 的 gawk= 指南..最底层的简单性。

相关内容