Awk

在 Android 命令上使用 awk

  • May 22, 2020

我有一個 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 輸出中獲取該程序的完整名稱。

$$ 1 $$$1並將其與awk 輸出一起列印。我被困在如何檢索它。我從以下命令開始

$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

我可以用以下方法提取pids:

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

由於 Android 使用procfs,您可以在/proc/$pid/exe. procfs但是,由於這是一個不符合普通 POSIX 規則的魔法(即)符號連結,因此您不能使用更常見的方法來找到它的目標。但是,您可以使用stat

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

line # 特定文件資訊提取的規範。以及語法模式|操作規則。awk 是連續的單行腳本,儘管已包裝。只需編寫$從 gawk 獲得的系統資訊程式碼的 a 和 #1-16。也許可以在 Playstore 上獲取指南並習慣它。它是一種出色的腳本語言。並且 awk 是開源的,如果您想重命名 # 您可以隨時更改程式碼以滿足您的資訊需求。

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

現在你需要操作,所以輸入 a|並指定你想要的資訊,從花括號中的哪些欄位和單引號中的整個內容…idk 關於包括---BEGIN. awk 在 android 上不需要它,但是我可以在我的手機上擁有比我知道的更多的 priv 也..祝你好運,我喜歡 gawk= awk 的指南 ..最簡單的最低點。

引用自:https://unix.stackexchange.com/questions/477787