- Android底層開發實戰
- 周慶國
- 1345字
- 2018-12-31 21:06:31
2.2.5 find和awk命令
在底層的開發過程中,使用查找相關命令進行關鍵字、正則表達式等的查找匹配,對于整個流程的編寫是很有幫助的。
在源碼的學習中,提倡使用cscope+vim的方式進行代碼的查看,這個方法對于源碼中的函數調用、宏變量等可以得到具體的輸出,方便進行瀏覽。而對于源碼中相關模塊和驅動在進行編寫時建議使用find、awk這兩個命令,可以達到事半功倍的效果。因此在本節,對這兩個命令進行詳細講解。
1.find命令
Linux下的文件表達格式非常復雜,對于Linux新手而言,find命令是了解和學習Linux文件特點的最佳方式之一。因為Linux發行版眾多,各個發行版的升級很快,對于曾經熟悉的Linux中的某個配置文件所在位置,有時也無法按圖索驥地找到。
雖然可以使用locate命令進行文件的查找,但僅僅是進行模糊匹配。locate命令是對生成的數據庫進行遍歷,生成數據庫的命令為updatedb。這一特性決定了用locate查找文件的速度很快,但是相應的精確度就會差點。所以,這里重點介紹find命令。
若想查找系統配置文件fstab在哪個目錄下,可以切換到根目錄,并使用如圖2-20所示命令。

圖2-20 find命令查找fstab文件
圖2-20中查找命令為find/-name fstab。經過查找,輸出結果顯示fstab文件在/etc/目錄下,如圖2-20最后一行所示。
圖2-21演示的是對不完整的文件名進行的查找。查找在/etc目錄下所有的包含wireless字樣的文件。

圖2-21 find命令查找帶有wireless字樣的文件
由圖2-21可見,輸出結果中有Permission denied的目錄。產生這一輸出的原因是,在Linux系統中,find命令是所有系統用戶都可以使用的命令,并不是ROOT系統管理員的專有權力。一旦Linux系統上系統管理員ROOT設定文件目錄的權限為禁止訪問,則find命令無法對這些文件進行讀操作,就會出現Permission denied的字樣。這時候通過特殊文件/dev/null,可以重定向這些錯誤信息到這個文件,避免它們顯示到輸出中。/dev/null文件用于表明空的或者錯誤的信息。
使用如下命令,可以方便地根據文件的特征進行文件查找。
find /-amin-10#查找系統最后10分鐘內訪問的文件 find /-group favorming #查找系統中屬于favorming group的文件 find /-mmin-5 #查找系統中最后5分鐘內修改過的文件
find命令可以通過遞歸的方式使用,以便對一個文件夾中的每個子文件夾所包括的文件進行信息匹配。當然通過指定參數–maxdepth選項,可以對這個遞歸查找方式的深度進行限制。
圖2-22演示了多個命令一起使用的狀況,例如對于文件的查看操作。用戶通常希望在知道路徑的情況下同時看到它的屬性,這時候可以采取這種方式。

圖2-22 find命令查找路徑及查看文件屬性
命令運行結果將所有包含有source的文件及其相關的屬性都顯示了出來。
2.awk命令
awk名稱來源于它的3位創始人Alfred Aho、Peter Weinberger、Brian Kemighan的姓氏的首字母。相對于grep的查找,awk命令具有更強大的功能,是一個強大的文本分析工具。
但更多時候awk是一種進行文本分析的編程語言,需要由用戶自定義函數和動態正則表達式進行處理。
下文將介紹一些關于awk命令的使用。
awk命令打印出vivado.log文件中所有包含set的行的內容,如圖2-23所示。

圖2-23 awk命令匹配字符串
打印出vivado.log文件中每一行的第一個字段的帶參命令如圖2-24所示。字段從行的左端開始,以空白符為分隔。若需要打印第N個字段,只需要在$1后面加上相應的$N即可。

圖2-24 awk命令打印每行第一個字段
如果將以上兩條命令結合起來,即可打印出所有包含set的行的第一個和第三個字段,如圖2-25所示。

圖2-25 awk命令打印包含set的行的第一和第三個字段
關于awk命令,更多的時候是將其看作一門編程語言進行操作,以實現更多更復雜的功能。若再加入正則表達式和函數定義,其功能將更加強大。