1.awk工作流程
a)先執行BEGIN; b)讀取文件,讀入有/n換行符分割的一條記錄 c)將記錄按指定的域分隔符進行劃分域 d)填充域,其中$0表示所有域,$1表示第一個域,$n表示第那個域(默認域分隔符是空白鍵或者tab鍵) e)開始執行模式所對應的動作action f)接著開始讀入第二條記錄,直到所有的記錄都被讀完 g)執行END操作
2.使用方法
awk [-F field-separator] '{pattern + action}' {filenames} 1. pattern表示awk在數據中查找的內容,action表示在找到匹配內容時所執行的一系列命令。action{}可以有多個語句,以";"號隔開。 2. [-F域分隔符]是可選的。 filenames是待處理的文件。在awk中,文件的每一行中,由域分隔符分開的每一項稱為一個域。通常,在不指名-F域分隔符的情況下,默認的域分隔符是空格。
3.awk內置變量
ARGC 命令行參數個數 ARGV 命令行參數排列 ENVIRON 支持隊列中系統環境變量的使用 FILENAME awk浏覽的文件名 FNR 浏覽文件的記錄數 FS 設置輸入域分隔符,等價於命令行 -F選項 NF 浏覽記錄的域的個數 NR 已讀的記錄數 OFS 輸出域分隔符 ORS 輸出記錄分隔符 RS 控制記錄分隔符
4.awk內置字符串函數
gsub(r,s) 在整個$0中用s替代r
gsub(r,s,t) 在整個t中用s替代r
index(s,t) 返回s中字符串t的第一位置
length(s) 返回s長度
match(s,r) 測試s是否包含匹配r的字符串
split(str,array,fs ) 在fs上將s分成序列a
sprint(fmt,exp) 返回經fmt格式化後的exp
sub(r,s) 用$0中最左邊最長的子串代替s
substr(s,p) 返回字符串s中從p開始的後綴部分
substr(s,p,n) 返回字符串s中從p開始長度為n的後綴部分
5.BEGIN和END
BEGIN表示在處理任意行之前進行的操作 END表示在所有輸入行處理完後進行的處理。
6.條件語句
if (expression) {
statement;
statement;
... ...
}
if (expression) {
statement;
} else {
statement2;
}
if (expression) {
statement1;
} else if (expression1) {
statement2;
} else {
statement3;
}
7.數組
因為awk中數組的下標可以是數字和字母,數組的下標通常被稱為關鍵字(key)。值和關鍵字都存儲在內部的一張針對key/value應用hash的表格裡。由於hash不是順序存儲,因此在顯示數組內容時會發現,它們並不是按照你預料的順序顯示出來的。數組和變量一樣,都是在使用時自動創建的,awk也同樣會自動判斷其存儲的是數字還是字符串。一般而言,awk中的數組用來從記錄中收集信息,可以用於計算總和、統計單詞以及跟蹤模板被匹配的次數等等。
awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
root
daemon
bin
sys
sync
games
......
awk -F'\t' '{ a[$1]++ }'END'{ for(j in a) print a[j],j }' filename | sort -rn | more filename的內容為: apple banana apple apple banana pear
輸出結果為: 3 apple 2 banana 1 pear