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

답변2

line # 특정 파일에서 정보를 추출하기 위한 사양입니다. 및 구문 패턴|작동 규칙. awk는 비록 포장되어 있지만 연속적인 한 줄짜리 스크립트입니다. $gawk에서 얻은 시스템 정보 코드의 a와 #1-16을 작성하면 됩니다 . 플레이스토어에서 가이드를 받아보시고 익숙해지시면 될 것 같습니다. 훌륭한 스크립팅 언어입니다. awk는 오픈 소스이며 # 이름을 바꾸려면 언제든지 정보 요구 사항에 맞게 코드를 변경할 수 있습니다.

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

이제 조치가 필요하므로 a를 입력 |하고 중괄호로 묶인 필드와 작은따옴표로 묶인 필드에서 원하는 정보를 지정하십시오. include에 대한 정보는 확인하지 마세요 ---BEGIN. awk는 안드로이드에서는 필요하지 않지만 아마도 내 휴대폰에 내가 생각하는 것보다 더 많은 권한이 있을 것입니다. 행운을 빕니다. 나는 가장 낮은 수준의 awk.. 단순성에 대한 gawk= 가이드를 좋아합니다.

관련 정보