標籤:awk shell
一. awk應用情境
格式化資料或從一個大的文字檔中抽取記錄
二. 使用方法
命令列方式
$awk [-F field-separator] ‘commands’ input-file(s)
commands是真正的awk命令
[-F域分割符]是可選的,如果無-F選項,awk預設用空格作為分隔字元,如果域分隔字元不為空白格,比如要瀏覽以”:”作為分隔字元的password檔案則必須指明-F選項,如:
awk -F: ‘commands’ input-file
awk指令檔
將1中的命令列寫入一個檔案,用bash或sh去解釋它,執行命令為shawkscriptfile或./awk_script_file, 後者需要給指令檔加執行許可權。
將所有awk命令寫入一個檔案awk_script_file,用$awk -f awk_script_file input-file(s),例如,
#record.txtzhangsan 21 M Hubeilisi 30 F Beijingwangwu 34 M Anhuiwangmazi 50 M Sichuanglilei 20 M Hubei#awk_script_file$2 > 30 {print $0}$awk -f awk.sh record.txtwangwu 34 M Anhuiwangmazi 50 M Sichuang
三. awk指令碼組成
awk語句都是由模式和動作組成。
模式即動作的執行條件,可以是條件陳述式或Regex,模式包括2個特殊欄位BEGIN和END。使用BEGIN語句設定計數和列印頭。BEGIN語句在文本瀏覽之前執行。END語句用來在awk完成文本瀏覽動作後列印出文本總數和結尾狀態。
動作大多數用來列印,在{}內指明,可以包含if和迴圈等,如果不指明動作awk將列印出所有瀏覽出來的記錄。
域和記錄
域即用分隔字元分割的欄位,用$1,$2,$3...,$n
表示第一個、第二個、第三個,第n個欄位, $0
表示所有欄位。
儲存awk輸出
$awk ‘$2 > 30 {print $1, $2}‘ record.txt > tmp.txt
動作中的Regex
動作中的Regex用表示方式為:/這則運算式/,域號匹配Regex用~後緊跟Regex,也可以用if()。例如,列印名字中包含“zhangsan”的所有記錄,
$ awk ‘{if ($1~/zhangsan/)print $0}‘ record.txt
或
$ awk ‘$1~/zhangsan/‘ record.txt#預設列印所有滿足條件的欄位
條件運算中常用的運算子和正則式
+, -, *, /, %, +=, -=, %=, ^=++, --~模糊比對,即**包含**!~不匹配==精確匹配 >, <, >=, <=, !=||, &&
Regex列舉
[Gg]reen或(Green|green) 匹配Green或green^...a 行首前三個字元任意,第四個是a
列印報告頭和報告尾
awk ‘BEGIN{print "Name Age\n-------------------------"} $2>30 && $3 == "M" {print $1, $2} END {print "end-of-report"}‘ record.txt
awk內建變數
AGRC 命令列參數個數ARGV 命令列參數列表ENVIRON 系統內容變數FNR 瀏覽檔案的記錄數FILENAME 瀏覽檔案名稱FS 網域名稱分隔字元,等價於-F選項NF 瀏覽記錄域個數NR 已讀記錄數OFS 輸出域分隔字元ORS 輸出記錄分隔字元RS 控制記錄分隔字元
awk內建字串函數
gsub(r, s) 在整個$0中用s替代rgsub(r, s, t) 在整個t中用s替代rindex(s, t) 返回s中字串t的第一個位置length(s) 返回s長度match(s, r) 測試s是否包含匹配的r字串split(s, a, fs) 用fs把s分割成序列asprintf(fmt, exp) 返回經fmt格式化的串substr(s, p) 返回字串s中從p開始的部分substr(s, p, n) 返回字串s中從p開始長度為n的部分
awk變數
變數提高了awk程式可讀性,下面是變數使用的簡單例子
awk ‘{name=$1;age=$2;sex=$3;if(age>30 && sex=="M")print "Name:" name " Age:" age}‘ record.txt
修改數範圍的值
#將姓名為"lilei"的年齡增加1,然後列印出所有記錄awk ‘{if ($1=="lilei") $2+=1;print "Name:"$1 " Age:"$2}‘ record.txt #將姓名為"lilei"的姓名修改為"Lilei",列印出修改後的記錄awk ‘$1=="lilei" {$1="Lilei";print "Name:"$1 " Age:"$2}‘ record.txt
統計
awk ‘{(tot += $2)};END{print "Total age:" tot}‘ record.txt
本文只是簡單的介紹了awk的基本文法,閱讀本文後可以用awk完成簡單的文本處理功能,awk博大精深,如果要深入學習建議閱讀更專業的awk文檔和相關書籍。
shell學習 - awk入門