android開發指令碼之awk

hfreeman2008發表於2016-06-26

這裡寫圖片描述

引言

android開發指令碼之過濾特定包名的log

這個樣例中,其它的都好懂,就是awk,可能如果沒有接觸過,就是有點不明白是怎麼回事,下面簡單的講講awk

簡介

awk是一個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。

使用方法

awk '{pattern + action}' {filenames}

儘管操作可能會很複雜,但語法總是這樣,其中 pattern 表示 AWK 在資料中查詢的內容,而 action 是在找到匹配內容時所執行的一系列命令。花括號({})不需要在程式中始終出現,但它們用於根據特定的模式對一系列指令進行分組。 pattern就是要表示的正規表示式,用斜槓括起來。

awk語言的最基本功能是在檔案或者字串中基於指定規則瀏覽和抽取資訊,awk抽取資訊後,才能進行其他文字操作。完整的awk指令碼通常用來格式化文字檔案中的資訊。

通常,awk是以檔案的一行為處理單位的。awk每接收檔案的一行,然後執行相應的命令,來處理文字。

呼叫awk

有三種方式呼叫awk

命令列方式

awk [-F  field-separator]  'commands'  input-file(s)

其中,commands 是真正awk命令,[-F域分隔符]是可選的。 input-file(s) 是待處理的檔案。
在awk中,檔案的每一行中,由域分隔符分開的每一項稱為一個域。通常,在不指名-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 預設按照空格進行分割,並將分隔後的值存入對應的 n4

n 變數中。如果一行還有 4 個單詞,將被分別儲存進
1, 2
2 ,
3, 4(
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包含兩個重要的關鍵字 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 為system的程式

$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/5964071
awk print 學習

2.http://cache.baiducontent.com/c?m=9d78d513d99004f64caad420024c91205b43811021ca95503ac3933fc2380b1f1a33a2ac275541598cd8293259e81806bdac636f644371edc08cdf57ddb99129328a2429731d9b4118d413a9ce4432c157ca1cb6f1&p=cb72c54ad5c340f34ebe9b7c554485&newp=8b2a9702909819f100bd9b7d0d17c6231610db2151d4d5166b82c825d7331b001c3bbfb423221b02d7c4766501a44d5ee0fa3075360021a3dda5c91d9fb4c57479cf616f2842de&user=baidu&fm=sc&query=awk&qid=822412cc0003b0ee&p1=1
linux awk命令詳解

相關文章