Use o awk em um comando do Android

0

Eu tenho um comando Android cuja saída é a seguinte:

$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

Existem entradas semelhantes no arquivo. Agora, o que eu quero é extrair o pid do campo exp_name (o kernel não tem acesso ao nome completo maior que 16 bytes) e obter o nome completo desse processo da saída do ps com ps pid -o comm= cf. [1] e imprima-o junto com $1 da saída awk. Eu estou preso em como recuperar isso. Eu comecei com o seguinte comando

$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}
'

Mas isso gera erros de sintaxe como:

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

[1] Há um problema com o Android awk, devido ao qual estou recorrendo aos utilitários da máquina host do 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

Portanto, esta saída tem 6 campos (separados por tabulações). No entanto, quando tento imprimir os campos individuais, isso não acontece e ainda imprime a linha inteira.

$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
    
por Zoso 25.10.2018 / 19:00

1 resposta

0

Eu sou capaz de extrair o pid s com:

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

Como o Android usa procfs , você pode ver o binário real como um link simbólico em /proc/$pid/exe . Mas, como esse é um link simbólico mágico (ou seja, procfs ) que não obedece às regras POSIX normais, você não pode usar os métodos mais comuns para encontrar o alvo. Você pode, no entanto, usar stat :

$ stat -c '%N' /proc/$$/exe
'/proc/4811/exe' -> '/system/bin/sh'
[...]
    
por 25.10.2018 / 19:22

Tags