awk的驚人表現 awk能夠勝任幾乎全部的文本處理工做。 awk 調用 1.調用awk: 方式一:命令行方式 awk [-F field-separator ] ‘commands’ input-file(s) [ -F域分隔符 ]是可選的,由於awk使用空格做爲缺省的域分隔符,所以若是要瀏覽域間有空格的文本,沒必要指定這個選項,若是要瀏覽例如passwd文件.此文件名域以冒號做爲分隔符,則必須指明-F選項,如: awk -F ‘commands’ input-file 方式二:將全部awk命令插入一個文件,並使阿瓦庫程序可執行,而後用awk命令解釋器做爲腳本的首行,以便經過鍵入腳本名成功來調用它. 方式三:將全部的awk命令插入一個單純文件,而後調用: awk -f awk-script-file input-file(s) -f選項指明在文件awk_script_file中的awk腳本,input_file(s)是使用awk進行瀏覽的文件名. 模式和動做 任何awk語句都是有模式和動做組成.在一個awk腳本中可能有不少語句,模式部分決定動做語句什麼時候觸發以及出發時間.處理即對數據進行的操做.若是省略模式部分,動做將時刻保持執行狀態.模式能夠是任何條件語句或符合語句或正則表達式.模式包括兩個特殊字段BEGIN和END.使用BEGIN語句設置計數和打印頭.BEGIN語句使用在任何文本瀏覽動做以前,以後文本瀏覽動做一句輸入文本開始執行.END語句用來在awk完成瀏覽動做後打印輸出文本總數和結尾狀態標識. 域和記錄 使用$1,$3表示參照第一個和第三個域,注意這裏使用逗號作域分割,若是但願打印一個有5個域的記錄的全部域,可以使用$0,意即全部域. 爲打印一個域或全部域,使用printf命令,這是一個awk動做 模式和動做 模式:兩個特殊段BEGIN和END 動做:實際動做大多在{}內指明 輸出: 1.抽取域 命令:awk -F: '{print $1}' /etc/passwd 輸出:打印/etc/passwd目錄下的全部用戶名 2.保存輸出 awk -F: ‘{print $1}’ /etc/passwd |tee user 使用tee命令,在輸出文件的同時,輸出到屏幕 3.使用標準輸出 awk -F : ‘{print $1}’ /etc/passwd > user3 4.打印全部記錄 awk -F : ‘{print $0}’ /etc/passwd 5.打印單獨記錄 awk -F: ‘{print $1,$4}’ /etc/passwd 6.打印報告頭 awk -F : ‘BEGIN{print 「NAME\n」}{print $1}’ /etc/passwd 7.打印結尾 awk -F: ‘{print $1}END{print 「this is all users\n」}’ /etc/passwd 條件操做符 1.匹配 awk -F : '{if($1~/root/) print}' /etc/passwd 分析:if($1~/roo/t) 表示若是file中包含root,打印他 2.精確匹配 使用符號== awk -F: '{if($3==0) print}' /etc/passwd 3.不匹配 !~ awk -F: '{if($1!~/linuxone/) print}' /etc/passwd 精確不匹配 != awk -F: '{if($1!=/linuxone/) print}' /etc/passwd 4.小於 < 5.小於等於 <= 6.大於 > 7.設置大小寫 awk ‘/[Rr]oot’ /etc/passwd 8.任意字符 awk -F : '{f($1~/^...t/) print}' /etc/passwd 分析:if($1~/^...t/)表示第四個字母是t 9.或關係匹配 awk -F : '{if($1~/(squid|nagios)/) print}' /etc/passwd 10.行首 awk '/^root/' /etc/passwd 分析:^root(行首包含root) 11 AND && awk -F : '{if($1=="root"&&$3=="0") print}' /etc/passwd 12.OR || 內置變量: 變量名 含義 ARCC 命令行參數個數 ARGV 命令行參數列表 ENV |RON 支持隊列中的系統環境變量的使用 FNR 瀏覽文件的記錄數 FS 置頂分隔符,等價於-F NF 瀏覽記錄的域的個數 NR 一度的記錄數 OFS 輸出域分隔符 ORS 輸出記錄分隔符 RS 控制記錄分隔符 案例: 打印有多少行記錄 awk 'END{print NR}' /etc/passwd 設置輸入域到變量名 awk -F : '{name=$1;path=$7; if(name~/root/)print name"\tpath is : " path}' /etc/passwd 域值比較操做 awk '{if($6<$7) print $0}' input-file 修改文本域只顯示修改的記錄 awk -F : '{if($1=="root"){$1="nagios server" ; print}}' /etc/passwd 文件長度相加 ls -l | awk '/^[^d]/ {print $9"\t" $5}{tot+=$5}\ END {print "total kb:"tot}' 內置的字符串函數 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(s,a,fs) 在fs上將s分紅序列a sub(s,) 用$0中最左邊也是最長的字符串替代 subtr(s,p) 返回字符串s中從p開始的後綴部分 substr(s,p,n) 返回字符串s中從p開始長度爲n的後綴部分 1.gsub awk 'gsub(/^root/,"netseek") {print}' /etc/passwd #將以root開頭的字符串替換爲netseek並打印 awk 'gsub(/0/,2){print}' /etc/passwd awk '{print gsub(/0/,2) $0}' /etc/fstab 2.index awk 'BEGIN{print index("root","o")}' #查詢o在root字符串中出現的第一位置 awk -F : '$1=="root" {print index($1,"o")" " $1}' /etc/passwd awk -F : '{print index($1,"o") $1}' /etc/passwd 3.length awk -F : '{print length($1)}' /etc/passwd wk -F : '$1=="root"{print length($1)"\t" $0}' /etc/passwd 4.match(在ANCD中查找C的位置) awk 'BEGIN{print match("ANCD","C")}' 5.split返回字符串數組元素個數 awk 'BEGIN{print split("123#456#789",array,"#")}' 6.sub只能替換指定域的第一個0 awk 'sub(/0/,2){print }' /etc/fstab 7.substr 按照起始位置以及長度返回字符串的一部分 awk 'BEGIN{print substr("www.baidu.com",5,9)}' #第五個子夫開始,取9個字符 awk 'BEGIN{print substr("www.baidu.com",5)}' #第五個位置開始,一直到最後 字符串屏蔽序列 符號 含義 \b 退格符 \f 走紙換頁 \n 新行 \r 回車 \t tab鍵(四個空格) \c 任意其餘特殊字符 \ddd 八進制 案例: awk -F : '{print $1,"\b" $2,"\t" $3}' /etc/passwd 分析:print和printf二者效果不一樣 printf修飾符 - : 左對齊 width : 域的步長0表示0步長 .prec : 最大字符串長度,或小數點右邊的位數 awk printf格式 符號 含義 %c ASCII字符 %d 整數 %e 科學計數法 %f 浮點數 %g awk決定使用哪一種浮點數轉換,e或者f %o 八進制數 %s 字符串 %x 十六進制 1.字符串轉換 echo "65" | awk '{printf "%c\n", $0}' awk 'BEGIN{printf "%c\n" ,65}' awk 'BEGIN{printf "%f\n",999}' 2.格式化輸出 awk -F : '{printf "%-15s %s\n",$1,$3}' /etc/passwd awk -F : 'BEGIN{printf "USER\t\tUID\n"}{printf "%-15s %s\n",$1,$3}' /etc/passwd 3.向一行awk命令傳值 who | awk '{if ($1==user) print $1 " you are connected :" $2}' user=$LOGNAME 4.awk腳本文件(在文件名字後面加後綴.awk翻遍區分) #!/bin/awk -f BEGIN{ FS=":" print "User\t\tUID" print "----------------" } {printf "%-15s %s\n",$1,$3} END{ print "end" } 分析:awk腳本文件開頭通常都是這樣的:#!/bin/awk -f 已經指明瞭 -f 選項。 執行時,直接在awk腳本名後面加要處理的文件名做爲參數便可。