unix的AWK命令介紹收藏收藏
awk語言的最基本功能是在文件或字符串中基于指定規(guī)則瀏覽和抽取信息,awk抽取信息后,才能進(jìn)行其他文本操作,完整的awk腳本通常用來格式化文本文件中的信息
調(diào)用awk:
第一種,命令行方式,如:awk [-F field-separator] 'commands'
input-file(s)
這里commands是真正的awk命令,[-F域分隔符]是可選的,awk默認(rèn)使用空格分隔,因此如果要瀏覽域間有空格的文本,不必指定這個(gè)選項(xiàng),但如果瀏覽如passwd文件,此文件各域使用冒號(hào)作為分隔符,則必須使用-F選項(xiàng):
awk -F : 'commands' input-file
第二種,將所有awk命令插入一個(gè)文件,并使awk程序可執(zhí)行,然后用awk命令解釋器作為腳本的首行,以便通過鍵入腳本名稱來調(diào)用它
第三種,將所有awk命令插入一個(gè)單獨(dú)文件,然后調(diào)用: awk -f awk-script-file
input-file
-f選項(xiàng)指明在文件awk-script-file的awk腳本,input-file是使用awk進(jìn)行瀏覽的文件名
awk腳本:
awk腳本由各種操作和模式組成,根據(jù)分隔符(-F選項(xiàng)),默認(rèn)為空格,讀取的內(nèi)容依次放置到對(duì)應(yīng)的域中,一行一行記錄讀取,直到文件尾
模式和動(dòng)作:任何awk語句都是由模式和動(dòng)作組成,在一個(gè)awk腳本中可能有許多語句。模式部分決定動(dòng)作語句何時(shí)觸發(fā)及觸發(fā)事件。動(dòng)作即對(duì)數(shù)據(jù)進(jìn)行的操作,如果省去模式部分,動(dòng)作將時(shí)刻保持執(zhí)行狀態(tài)
模式可以是任何條件語句或復(fù)合語句或正則表達(dá)式,模式包含兩個(gè)特殊字段BEGIN和END,使用BEGIN語句設(shè)置計(jì)數(shù)和打印頭,BEGIN語句使用在任何文本瀏覽動(dòng)作之前,之后文本瀏覽動(dòng)作依據(jù)輸入文件開始執(zhí)行;END語句用來在awk完成文本瀏覽動(dòng)作后打印輸出文本總數(shù)和結(jié)尾狀態(tài)標(biāo)志,有動(dòng)作必須使用{}括起來
實(shí)際動(dòng)作在大括號(hào){}內(nèi)指明,常用來做打印動(dòng)作,但是還有更長的代碼如if和循環(huán)looping語句及循環(huán)退出等,如果不指明采取什么動(dòng)作,awk默認(rèn)打印出所有瀏覽出的記錄
域和記錄:
awk執(zhí)行時(shí),其瀏覽標(biāo)記為$1,$2...$n,這種方法稱為域標(biāo)記.使用$1,$3表示參照第1和第3域,注意這里使用逗號(hào)分隔域,使用$0表示使用所有域
例:awk '{print $0}' temp.txt > sav.txt
表示打印所有域并把結(jié)果重定向到sav.txt中
awk '{print $0}' temp.txt|tee sav.txt
和上例相似,不同的是將在屏幕上顯示出來
awk '{print $1,$4}' temp.txt
只打印出第1和第4域
awk 'BEGIN {print "NAME
GRADE\n-------------"} {print $1"\t"$4}' temp.txt
表示打信息頭,即輸入的內(nèi)容的第一行前加上"NAME
GRADE\n-------------",同時(shí)內(nèi)容以tab分開
awk 'BEGIN {print "being"} {print $1} END
{print "end"}' temp 同時(shí)打印信息頭和信息尾
條件操作符:
<、<=、==、!=、>=、~匹配正則表達(dá)式、!~不匹配正則表達(dá)式
匹配:awk '{if ($4~/ASIMA/) print $0}' temp
表示如果第四個(gè)域包含ASIMA,就打印整條
awk '$0 ~ /ASIMA/' temp
表示只要整條包含ASIMA就打印出來
精確匹配:awk '$3=="48" {print $0}' temp
只打印第3域等于"48"的記錄
不匹配: awk '$0 !~ /ASIMA/' temp
打印整條不包含ASIMA的記錄
不等于: awk '$1 != "asima"' temp
小于: awk '{if ($1<$2) print $1 "is
smaller"}' temp
設(shè)置大小寫: awk '/[Gg]reen/'
temp 打印整條包含Green,或者green的記錄
任意字符: awk '$1 ~/^...a/'
temp 打印第1域中第四個(gè)字符是a的記錄,^從行首開始,.任意字符
或關(guān)系匹配: awk '$0~/(abc)|(efg)/' temp
使用|時(shí),語句需要括起來
AND與關(guān)系: awk '{if ( $1=="a" && $2=="b" )
print $0}' temp
OR或關(guān)系: awk '{if ($1=="a" || $1=="b") print
$0}' temp
awk內(nèi)置變量:
ARGC 命令行參數(shù)個(gè)數(shù) AGRV 命令行參數(shù)排列
ENVIRON 支持隊(duì)列中系統(tǒng)環(huán)境變量的使用
FILENAME awk瀏覽的文件名 FNR 瀏覽文件的記錄數(shù) FS
設(shè)置輸入域分隔符,同- F選項(xiàng)
NF 瀏覽記錄的域個(gè)數(shù) NR 已讀的記錄數(shù) OFS 輸出域分隔符
ORS 輸出記錄分隔符 RS 控制記錄分隔符
例: awk 'END {print NR}' temp 在最后打印已讀記錄條數(shù)
awk '{print NF,NR,$0} END {print FILENAME}'
temp
awk '{if (NR>0 && $4~/Brown/)
print $0}' temp 至少存在一條記錄且包含Brown
NF的另一用法: echo $PWD | awk -F/ '{print $NF}'
顯示當(dāng)前目錄名
awk操作符:
在awk中使用操作符,基本表達(dá)式可以劃分成數(shù)字型、字符串型、變量型、域及數(shù)組元素
設(shè)置輸入域到變量名:
awk '{name=$1;six=$3; if (six=="man") print
name " is " six}' temp
域值比較操作:
awk 'BEGIN {BASE="27"} {if ($4<BASE) print
$0}' temp
修改數(shù)值域取值:(原輸入文件不會(huì)被改變)
awk '{if ($1=="asima") $6=$6-1;print
$1,$6,$7}' temp
修改文本域:
awk '{if ($1=="asima) ($1=="desc");print $1}'
temp
只顯示修改記錄:(只顯示所需要的,區(qū)別上一條命令,注意{})
awk '{if ($1=="asima) {$1=="desc";print$1}}'
temp
創(chuàng)建新的輸出域:
awk '{$4=$3-$2; print $4}' temp
統(tǒng)計(jì)列值:
awk '(tot+=$3);END {print tot}'
temp 會(huì)顯示每列的內(nèi)容
awk '{(tot+=$3)};END {print tot}'
temp 只顯示最后的結(jié)果
文件長度相加:
ls -l|awk '/^[^d]/ {print $9"\t"$5} {tot+=$5}
END{print "totKB:" tot}' #[^d]是指匹配除去d的字符
只列出文件名:
ls -l|awk '{print $9}' 常規(guī)情況文件名是第9域
awk內(nèi)置字符串函數(shù):
gsub(r,s) 在整個(gè)$0中用s替代r
awk 'gsub(/name/,"xingming") {print $0}'
temp
gsub(r,s,t) 在整個(gè)t中用s替代r
index(s,t) 返回s中字符串t的第一位置
awk 'BEGIN {print index("Sunny","ny")}'
temp 返回4
length(s) 返回s的長度
match(s,r) 測(cè)試s是否包含匹配r的字符串
awk '$1=="J.Lulu" {print match($1,"u")}'
temp 返回4
split(s,a,fs) 在fs上將s分成序列a
awk 'BEGIN {print
split("12#345#6789",myarray,"#")"'
返回3,同時(shí)myarray[1]="12", myarray[2]="345",
myarray[3]="6789"
sprint(fmt,exp) 返回經(jīng)fmt格式化后的exp
sub(r,s) 從$0中最左邊最長的子串中用s代替r(只更換第一遇到的匹配字符串)
substr(s,p) 返回字符串s中從p開始的后綴部分
substr(s,p,n) 返回字符串s中從p開始長度為n的后綴部分
printf函數(shù)的使用:
字符轉(zhuǎn)換: echo "65" |awk '{printf "%c\n",$0}'
輸出A
awk 'BEGIN {printf "%f\n",999}'
輸出999.000000
格式化輸出:awk '{printf "%-15s %s\n",$1,$3}' temp
將第一個(gè)域全部左對(duì)齊顯示
其他awk用法:
向一行awk命令傳值:
awk '{if ($5<AGE) print $0}' AGE=10
temp
who | awk '{if ($1==user) print $1 " are in
" $2 ' user=$LOGNAME 使用環(huán)境變量
awk腳本命令:
開頭使用 !/bin/awk -f ,如果沒有這句話自含腳本將不能執(zhí)行,例子:
- !/bin/awk -f
- # all comment lines must start with a hash '#'
- # name: student_tot.awk
- # to call: student_tot.awk grade.txt
- # prints total and average of club student points
-
- # print a header first
- BEGIN
- {
- print "Student Date Member No. Grade Age Points Max"
- print "Name Joined Gained Point
Available"
- print
"================================================================="
- }
- # let's add the scores of points gained
- (tot+=$6); ?
- # finished processing now let's print the total and average point
- END
- {
- print "Club student total points :" tot
- print "Average Club Student points :" tot/NR
- }
awk數(shù)組:
awk的循環(huán)基本結(jié)構(gòu) For (element in array) print
array[element]
awk 'BEGIN {split("12#345#6789",myarray,"#"); for (a in myarray) print myarray[a]}'