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

以下を使用してsを抽出できますpid

$ 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'
[...]

おすすめ記事