文章轉自 http://www.cnblogs.com/zhuyp1015/archive/2012/07/14/2591842.htmlhtml
先來總結一下awk內置變量:正則表達式
ARGC 命令行參數個數
ARGV 命令行參數排列
ENVIRON 支持隊列中系統環境變量的使用
FILENAME awk瀏覽文件名
FNR 瀏覽文件的記錄數
FS 設置輸入域分隔符,等價於命令行-F選項
NF 瀏覽記錄的域個數
NR 已讀的記錄數
OFS 輸出域分隔符
ORS 輸出例句分隔符
RS 控制記錄分隔符
$ awk '{print NF,NR,$0} END {print FILENAME}' grade.txt
7 1 M.Tansley 05/99 48311 Green 8 40 44
7 2 J.Lulu 06/99 48317 green 9 24 26
7 3 P.Bunny 02/99 48 Yellow 12 35 28
7 4 J.Troll 07/99 4842 Brown-3 12 26 26
7 5 L.Tansley 05/99 4712 Brown-2 12 30 28
grade.txt
#使用 -F 參數指定分隔符
$ echo $PWD
/home/zhuyupeng
$ echo $PWD | awk -F/ '{print $NF"\t"NF}'
zhuyupeng 3
#設置變量名,將27 賦值給變量BASELINE
$ awk 'BEGIN {BASELINE="27"} $6<BASELINE {print $0}' grade.txt
J.Lulu 06/99 48317 green 9 24 26
J.Troll 07/99 4842 Brown-3 12 26 26
#修改數值域取值,注意‘{}’
$ awk '{if($1=="M.Tansley") $6=$6-1; print $1,$6,$7}' grade.txt
M.Tansley 39 44
J.Lulu 24 26
P.Bunny 35 28
J.Troll 26 26
L.Tansley 30 28
#修改文本域取值
$ awk '{if($1=="J.Troll") $1="J.L.Troll"; print $1}' grade.txt
M.Tansley
J.Lulu
P.Bunny
J.L.Troll
L.Tansley
#建立新的輸出域,這裏新的輸出域爲 diff
$ awk 'BEGIN {print "Name \t Difference"} {if($6<$7) {diff=$7-$6; print $1,diff}}' grade.txt
Name Difference
M.Tansley 4
J.Lulu 2
#統計某一個域的和,使用‘+=’ 下面的例子統計第六個域的和
$ awk '(tot+=$6); END{print "Club student total points: " tot}' grade.txt
M.Tansley 05/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
P.Bunny 02/99 48 Yellow 12 35 28
J.Troll 07/99 4842 Brown-3 12 26 26
L.Tansley 05/99 4712 Brown-2 12 30 28
Club student total points: 155
#注意區別,加‘{}’則不打印文件
$ awk '{(tot+=$6)}; END{print "Club student total points: " tot}' grade.txt
Club student total points: 155
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(s,a,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的後綴部分
#替換,目標串使用正則表達式格式‘//’
$ awk 'gsub(/4842/,4899) {print $0}' grade.txt
J.Troll 07/99 4899 Brown-3 12 26 26
#查詢字符串第一次出現的位置,注意使用BEGIN,不然每一行都會打印,字符串使用引號括起來
$ awk 'BEGIN{print index("Bunny","ny")}' grade.txt
4
#長度
$ awk '$1=="J.Troll" {print length($1)" "$1}' grade.txt
7 J.Troll
#match 使用: 找不到返回0,找到返模式串在匹配串中的位置,
#注:單獨使用 加BEGIN
$ awk 'BEGIN {print match("ANCD",/d/)}'
0
$ awk '$1=="J.Lulu" {print match($1,"u")}' grade.txt
4
$ awk '$1=="J.Lulu" {print match($1,/u/)}' grade.txt
4
#split 返回字符串數組元素個數
$ awk 'BEGIN {print split("123#456#789",myarray,"#");print myarray[1],myarray[2],myarray[3]}'
3
123 456 789
#sub,發現並替換模式的第一個位置
$ awk '$1=="J.Troll" {sub(26,29,$0)} {print $0}' grade.txt
M.Tansley 05/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
P.Bunny 02/99 48 Yellow 12 35 28
J.Troll 07/99 4842 Brown-3 12 29 26
L.Tansley 05/99 4712 Brown-2 12 30 28
#substr,返回字符串指定範圍內的子串
$ awk '$1=="L.Tansley" {print substr($1,1,5)}' grade.txt
L.Tan
#使用substr返回指定位置開始的後綴部分,範圍只給了一個參數,注意和上一個例子相對比
$ awk '{print substr($1,3)}' grade.txt
Tansley
Lulu
Bunny
Troll
Tansley
#從shell中向awk傳遞字符串,經過 echo 加管道的方式
$ echo "Test" | awk '{print length($0)}'
4
$ STR="mydoc.txt"
$ echo $STR | awk '{print substr($STR,7)}'
txt