在 linux 系統中,有三個強大的文本分析處理工具:grep sed awk,其中:
grep 用於搜索文本內容 => linux grep 命令常見用法
sed 用於編輯文本內容 => linux sed 命令常見用法
awk 用於處理和生成報表 => linux awk 命令常見用法
awk 的工作原理是將文件內容逐行讀入,然后以每一行中的空格為分隔符將每行數據切分成幾列,再對每列的元素進行各種分析處理。
下面結合實例簡單介紹 awk 命令常用的幾種格式:
假設文件 form.txt 中有如下內容:
Num Name Company Product 1 Jobs Apple iPhone 2 Jack Alibaba taobao 3 Pony Tencent wechat
1. 打印第二列和第三列:
awk '{print $2 $3}' form.txt
>> NameCompany JobsApple JackAlibaba PonyTencent
awk 的命令都寫在單引號內,再用花括號括起來,這里的 $2 $3 分別表示第二列和第三列, $0 則表示整行;
可以看到第二列和第三列就打印出來了,但是兩列數據緊貼在一起,如果我們希望以制表符來分隔開:
awk '{print $2"\t"$3}' form.txt
>> Name Company Jobs Apple Jack Alibaba Pony Tencent
注意制表符 \t 需要用雙引號括起來
2. 打印出第 2,3,4 行的第二列和第三列,以制表符分隔開:
awk '/^[0-9]/{print $2"\t"$3}' form.txt >> Jobs Apple Jack Alibaba Pony Tencent
這里用到了 awk 的一種常用語法: awk ‘ 樣式{命令}’ file
表示從文件 file 中取出那些符合 “樣式” 的行,然后對這些行執行{命令}
這里的 “樣式” 一般是正則表達式,用定界符 / / 括起來,命令依然是用花括號括起來
所以上面這個例子就表示:取出那些以數字開頭的行,打印這些行的第二列和第三列,並以制表符分隔開
3. 打印出前三行的第二列和第三列:
awk '{ if (NR<=3) {print $2"\t"$3} }' form.txt >> Name Company Jobs Apple Jack Alibaba
這里用到了 awk 編程,在花括號內寫了一小段程序,awk 編程基本都是借鑒 C 語言,所以 C 語言中常見的 if for while 等控制結構都可以直接借用。
這個例子中還用到了awk 內嵌特殊變量 NR,NR 記錄的是當前行號,awk還有很多其他的內嵌變量,比如 NF 表示當前行有多少列。
在數字后端設計中,經常需要從一些 report 中抓出某幾行的某一列數據,比如 timing report 中的 cell name 或者 pin name,此時就很適合用這種簡短的 awk 編程來處理。
4. BEGIN END 語句塊
使用 awk 命令時也經常會用到 BEGIN / END 語句塊,例如:
打印第二列和第三列,且在打印第一行之前先打印出字符串“ Start:”, 打印完最后一行后接着打印出字符串 “ End " :
awk 'BEGIN { print "Start:" } { print $2"\t"$3} END {print "End"}' form.txt >> Start: Name Company Jobs Apple Jack Alibaba Pony Tencent End
5. 使用 “非空格字符” 切分列
默認情況下,awk 命令讀入一行數據后,會用這行中的空格將整行數據切分成若干列,但是有些數據不是以空格作為間隔的,比如下面這組:
Num,Name,Company,Product 1,Jobs,Apple,iPhone 2,Jack,Alibaba,taobao 3,Pony,Tencent,wechat
此時,如果想要打印出第二列和第三列,就需要使用選項 “ -F ” 來指定分隔符:
awk -F"," '{print $2"\t"$3 }' form.txt >> Name Company Jobs Apple Jack Alibaba Pony Tencent
這里的選項 -F "," 就表示以每行數據中的逗號為分隔符,來切分數據。
awk 命令的用法非常多,可以實現非常復雜的報表分析處理,這里只介紹了最常見的幾種用法,
如果希望深入了解,可以參考awk編程相關書籍,或者直接訪問GNU awk 官網:
http://www.gnu.org/software/gawk/manual/gawk.html
|------------------------------------------|