android開発スクリプトのawk

12510 ワード

引用する
Android開発スクリプトの特定のパケット名をフィルタするlog
この例では、他のことはよくわかりますが、awkです.接触したことがなければ、何が起こっているのか少し分かりません.以下、awkについて簡単に説明します.
概要
awkは強力なテキスト分析ツールであり、grepの検索、sedの編集に比べて、awkはデータを分析し、レポートを生成する際に特に強力に見えます.簡単に言えばawkは、ファイルを行ごとに読み込み、スペースをデフォルトの区切り文字として各行をスライスし、切った部分を様々な分析処理を行います.
使用方法
awk '{pattern + action}' {filenames}
操作は複雑かもしれませんが、構文は常にこのようになります.patternはAWKがデータで検索したコンテンツを表し、actionは一致するコンテンツを見つけたときに実行される一連のコマンドです.カッコ({})は、プログラム内で常に現れる必要はありませんが、特定のモードに基づいて一連の命令をグループ化するために使用されます.patternは表す正規表現で、スラッシュで囲まれています.
awk言語の最も基本的な機能は、ファイルまたは文字列で指定されたルールに基づいて情報を参照および抽出し、awkが情報を抽出した後、他のテキスト操作を行うことです.完全なawkスクリプトは、通常、テキストファイルの情報をフォーマットするために使用されます.
通常、awkはファイルの動作処理単位です.awkは、ファイルの1行を受信するたびに、対応するコマンドを実行してテキストを処理します.
呼び出しawk
awkを呼び出すには3つの方法があります
コマンドライン方式
awk [-F  field-separator]  'commands'  input-file(s)
ここで、commandsは真のawkコマンドであり、[-Fドメイン区切り記号]はオプションである.input-file(s)は処理対象のファイルです.awkでは、ファイルの各行において、ドメイン区切り記号で区切られた各項目を1つのドメインと呼ぶ.通常、-Fドメイン区切り記号を指定しない場合、デフォルトのドメイン区切り記号はスペースです.
shellスクリプト方式
すべてのawkコマンドをファイルに挿入し、awkプログラムを実行できます.その後、awkコマンド解釈器はスクリプトの最初の行として、スクリプト名を入力して呼び出されます.shellスクリプトの最初の行に相当します:#!/bin/shは:#!/bin/awk
すべてのawkコマンドを個別のファイルに挿入し、次のように呼び出します.
awk -f awk-script-file input-file(s)
ここで、-fオプションはawk-script-fileのawkスクリプトをロードし、input-file(s)は上記と同じです.
いくつかの簡単な使用例
1.プロセス情報の表示
adb shell ps > ps.txt
ps.txtの表示
cat ps.txt
2.Awkのデフォルト動作
デフォルトではawk印刷ファイルの各行
awk '{print;}' ps.txt
3.Awk一致する行を印刷する
android@tesdt-Precision-T1700:~/Desktop$ awk '/com.android.phone/' ps.txt 
radio     2369  683   1510652 83040 SyS_epoll_ 0000000000 S com.android.phone
4.Awk指定されたドメインのみ印刷
Awkには多くの組み込み変数が含まれており、各行のレコードについては、Awkはデフォルトでスペースで分割され、分割された値が対応するn変数に格納されます.1行に4つの単語がある場合、1,2,3,4にそれぞれ格納され、(0)は行全体を表す.$NFは最後のフィールドを表します
awk '{print $1, $2} ' ps.txt
root 10570
root 10659
root 10737
root 10782
root 10783
root 10815
root 10850
root 10930
shell 10945
awk '{print $1, $NF} ' ps.txt
root kworker/u16:0
root kworker/4:0
root kworker/6:1
shell ps
5.Awkの開始と最後の動作
Awkには2つの重要なキーワードBEGINとENDが含まれています
BEGIN { Actions} {ACTION} # Action for everyline in a file END { Actions } 
BEGINセクションのActionsは、ファイル内のローを読み込む前に実行されます.一方、ENDセクションのActionsは、ファイル内のすべてのローを読み取り、処理した後に実行されます.
awk 'BEGIN {print "-------start--";}
{print $1,"/t", $2,"/t", $3,"/t",$NF;}
END{print "-----------end------";
} ' ps.txt

-------start--
USER /t PID /t PPID /t NAME
root /t 10783 /t 2 /t kworker/5:0
root /t 10815 /t 2 /t kworker/u16:0
root /t 10850 /t 2 /t kworker/4:0
root /t 10930 /t 2 /t kworker/6:1
shell /t 10945 /t 655 /t ps
-----------end------
6.Awk社員PIDが1000より大きい進捗情報を探し出す
awk '$2 > 10800' ps.txt 
USER      PID   PPID  VSIZE  RSS   WCHAN              PC  NAME
root      10815 2     0      0     worker_thr 0000000000 S kworker/u16:0
root      10850 2     0      0     worker_thr 0000000000 S kworker/4:0
root      10930 2     0      0     worker_thr 0000000000 S kworker/6:1
shell     10945 655   3788   1068           0 7f997f26ac R ps
7.Awk印刷USERがシステムのプロセス
$1はUSERを表し、systemに等しい場合は行全体を印刷します.
awk '$1 ~/system/' ps.txt
system    4542  683   1434148 32520 SyS_epoll_ 0000000000 S com.qualcomm.qti.notificationservice
system    4917  683   1436844 34788 SyS_epoll_ 0000000000 S org.simalliance.openmobileapi.service:remote
system    4928  683   1435396 33368 SyS_epoll_ 0000000000 S com.qualcomm.display
system    10546 683   1464360 36076 SyS_epoll_ 0000000000 S com.android.settings
system    10558 683   1457292 34904 SyS_epoll_ 0000000000 S com.qualcomm.qti.ext 
~オペレータは正規表現の値と比較し、一致する場合は行全体を印刷します.
参考資料
1.http://blog.csdn.net/andyxm/article/details/5964071awk print学習
2.http://cache.baiducontent.com/c?m=9d78d513d99004f64caad420024c91205b43811021ca95503ac3933fc2380b1f1a33a2ac275541598cd8293259e81806bdac636f644371edc08cdf57ddb99129328a2429731d9b4118d413a9ce4432c157ca1cb6f1&p=cb72c54ad5c340f34ebe9b7c554485&newp=8b2a9702909819f100bd9b7d0d17c6231610db2151d4d5166b82c825d7331b001c3bbfb423221b02d7c4766501a44d5ee0fa3075360021a3dda5c91d9fb4c57479cf616f2842de&user=baidu&fm=sc&query=awk&qid=822412cc0003b0ee&p1=1linux awkコマンドの詳細