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はパッケージ化されていますが、連続した1行のスクリプトです。$gawkから取得したシステム情報コードのaと#1-16を作成するだけです。プレイストアでガイドを受け取り、慣れていただければと思います。素晴らしいスクリプト言語です。 awk はオープンソースであり、# の名前を変更するには、いつでも情報要件に合わせてコードを変更できます。

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

これでアクションが必要になるので、aを入力し|て中括弧で囲まれたフィールドと一重引用符で囲まれたフィールドに必要な情報を指定します。 includeに関する情報を確認しないでください---BEGIN。 awkはAndroidでは必要ありませんが、おそらく私の携帯電話に私が思うよりも多くの権限があります。頑張ってください。私は最も低いレベルのawk..シンプルさのためのgawk =ガイドが好きです。

関連情報