變量 | 描述 |
---|---|
\$n | 當(dāng)前記錄的第n個(gè)字段,字段間由FS分隔 |
\$0 | 完整的輸入記錄 |
ARGC | 命令行參數(shù)的數(shù)目 |
ARGIND | 命令行中當(dāng)前文件的位置(從0開(kāi)始算) |
ARGV | 包含命令行參數(shù)的數(shù)組 |
CONVFMT | 數(shù)字轉(zhuǎn)換格式(默認(rèn)值為%.6g)ENVIRON環(huán)境變量關(guān)聯(lián)數(shù)組 |
ERRNO | 最后一個(gè)系統(tǒng)錯(cuò)誤的描述 |
FIELDWIDTHS | 字段寬度列表(用空格鍵分隔) |
FILENAME | 當(dāng)前文件名 |
FNR | 各文件分別計(jì)數(shù)的行號(hào) |
FS | 字段分隔符(默認(rèn)是任何空格) |
IGNORECASE | 如果為真,則進(jìn)行忽略大小寫(xiě)的匹配 |
NF | 一條記錄的字段的數(shù)目 |
NR | 已經(jīng)讀出的記錄數(shù),就是行號(hào),從1開(kāi)始 |
OFMT | 數(shù)字的輸出格式(默認(rèn)值是%.6g) |
OFS | 輸出記錄分隔符(輸出換行符),輸出時(shí)用指定的符號(hào)代替換行符 |
ORS | 輸出記錄分隔符(默認(rèn)值是一個(gè)換行符) |
RLENGTH | 由match函數(shù)所匹配的字符串的長(zhǎng)度 |
RS | 記錄分隔符(默認(rèn)是一個(gè)換行符) |
RSTART | 由match函數(shù)所匹配的字符串的第一個(gè)位置 |
SUBSEP | 數(shù)組下標(biāo)分隔符(默認(rèn)值是/034) |
示例
[root@localhost ~]# echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" | awk '{print "Line No:"NR", No of fields:"NF, "$0="$0, "$1="$1, "$2="$2, "$3="$3}' Line No:1, No of fields:3 $0=line1 f2 f3 $1=line1 $2=f2 $3=f3 Line No:2, No of fields:3 $0=line2 f4 f5 $1=line2 $2=f4 $3=f5 Line No:3, No of fields:3 $0=line3 f6 f7 $1=line3 $2=f6 $3=f7
使用print $NF可以打印出一行中的最后一個(gè)字段,使用$(NF-1)則是打印倒數(shù)第二個(gè)字段,其他以此類(lèi)推:
[root@localhost ~]# echo -e "line1 f2 f3\n line2 f4 f5" | awk '{print $NF}' f3 f5 [root@localhost ~]# echo -e "line1 f2 f3\n line2 f4 f5" | awk '{print $(NF-1)}' f2 f4
統(tǒng)計(jì)/etc/passwd:文件名,每行的行號(hào),每行的列數(shù),對(duì)應(yīng)的完整行內(nèi)容:
[root@localhost ~]# awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash filename:/etc/passwd,linenumber:2,columns:7,linecontent:bin:x:1:1:bin:/bin:/sbin/nologin filename:/etc/passwd,linenumber:3,columns:7,linecontent:daemon:x:2:2:daemon:/sbin:/sbin/nologin
統(tǒng)計(jì)/etc/passwd文件中的命令行參數(shù)ARGC,文件行號(hào)FNR,字段分隔符FS,一條記錄的字段數(shù)目NF,已經(jīng)讀出的記錄數(shù)(默認(rèn)是行號(hào))NR
[root@localhost ~]# awk -F: 'BEGIN{printf "%4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR}' /etc/passwd FILENAME ARGC FNR FS NF NR --------------------------------------------- /etc/passwd 2 1 : 7 1 /etc/passwd 2 2 : 7 2 /etc/passwd 2 3 : 7 3
1.awk賦值運(yùn)算
賦值語(yǔ)句運(yùn)算符:= += -= *= /= %= ^= **=
例如:a+=5;等價(jià)于a=a+5
[root@localhost ~]# awk 'BEGIN{a=5;a+=5;print a}' 10
2.awk正則運(yùn)算
輸出包含有root的行,并打印用戶(hù)名和UID及原行內(nèi)容
[root@localhost ~]# awk -F: '/root/ {print $1,$3,$0}' /etc/passwd root 0 root:x:0:0:root:/root:/bin/bash operator 11 operator:x:11:0:operator:/root:/sbin/nologin
我們發(fā)現(xiàn)找到了兩行,如果我們想找root開(kāi)頭的行就要這樣寫(xiě):awk -F: '/^root/' /etc/passwd
3.awk三目運(yùn)算
[root@localhost ~]# awk 'BEGIN{a="b";print a=="b"?"ok":"err"}' ok [root@localhost ~]# awk 'BEGIN{a="b";print a=="c"?"ok":"err"}' err
三目運(yùn)算其實(shí)就是一個(gè)判斷運(yùn)算,如果為真則輸出?后的內(nèi)容,如果為假則輸出:后的內(nèi)容
4.awk的循環(huán)運(yùn)用
if語(yǔ)句運(yùn)用
[root@localhost ~]# awk 'BEGIN{ test=100;if(test>90){ print "vear good";} else{print "no pass";}}' vear good
每條命令后用;結(jié)尾
while循環(huán)運(yùn)用
計(jì)算從1累加到100的值
[root@localhost ~]# awk 'BEGIN{test=100;num=0;while(i<=test){num+=i; i++;}print num;}' 5050 for循環(huán)的運(yùn)用 [root@localhost ~]# awk 'BEGIN{test=0;for(i=0;i<=100;i++){test+=i;}print test;}' 5050 do循環(huán)的運(yùn)用 [root@localhost ~]# awk 'BEGIN{test=0;i=0;do{test+=i;i++}while(i<=100)print test;}' 5050
5.awk的數(shù)組運(yùn)用
數(shù)組是awk的靈魂,處理文本中最不能少的就是它的數(shù)組處理。因?yàn)閿?shù)組索引(下標(biāo))可以是數(shù)字和字符串在awk中數(shù)組叫做關(guān)聯(lián)數(shù)組(associative arrays)。awk 中的數(shù)組不必提前聲明,也不必聲明大小。數(shù)組元素用0或空字符串來(lái)初始化,這根據(jù)上下文而定。一般而言,awk中的數(shù)組用來(lái)從記錄中收集信息,可以用于計(jì)算總和、統(tǒng)計(jì)單詞以及跟蹤模板被匹配的次數(shù)等等。
顯示/etc/passwd的賬戶(hù)
awk -F: 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd 0 root 1 bin 2 daemon 3 adm 4 lp 5 sync ........................................................................
6.awk字符串函數(shù)的運(yùn)用
函數(shù)名 描述
sub 匹配記錄中最大、最靠左邊的子字符串的正則表達(dá)式,并用替換字符串替換這些字符串。如果沒(méi)有指定目標(biāo)字符串就默認(rèn)使用整個(gè)記錄。替換只發(fā)生在第一次匹配的 時(shí)候
sub (regular expression, substitution string):
sub (regular expression, substitution string, target string)
實(shí)例:
awk '{ sub(/test/, "mytest"); print }' testfile awk '{ sub(/test/, "mytest"); $1}; print }' testfile
第一個(gè)例子在整個(gè)記錄中匹配,替換只發(fā)生在第一次匹配發(fā)生的時(shí)候。如要在整個(gè)文件中進(jìn)行匹配需要用到gsub
第二個(gè)例子在整個(gè)記錄的第一個(gè)域中進(jìn)行匹配,替換只發(fā)生在第一次匹配發(fā)生的時(shí)候。
gsub 整個(gè)文檔中進(jìn)行匹配
gsub (regular expression, substitution string)
gsub (regular expression, substitution string, target string)
實(shí)例:
awk '{ gsub(/test/, "mytest"); print }' testfile awk '{ gsub(/test/, "mytest" , $1) }; print }' testfile
第一個(gè)例子在整個(gè)文檔中匹配test,匹配的都被替換成mytest。
第二個(gè)例子在整個(gè)文檔的第一個(gè)域中匹配,所有匹配的都被替換成mytest。
index 返回子字符串第一次被匹配的位置,偏移量從位置1開(kāi)始
index(string, substring)
實(shí)例:
awk '{ print index("test", "mytest") }' testfile
實(shí)例返回test在mytest的位置,結(jié)果應(yīng)該是3。
substr 返回從位置1開(kāi)始的子字符串,如果指定長(zhǎng)度超過(guò)實(shí)際長(zhǎng)度,就返回整個(gè)字符串
substr( string, starting position )
substr( string, starting position, length of string )
實(shí)例:
awk '{ print substr( "hello world", 7,11 ) }'
上例截取了world子字符串。
split 可按給定的分隔符把字符串分割為一個(gè)數(shù)組。如果分隔符沒(méi)提供,則按當(dāng)前FS值進(jìn)行分割
split( string, array, field separator )
split( string, array )
實(shí)例:
awk '{ split( "20:18:00", time, ":" ); print time[2] }'
上例把時(shí)間按冒號(hào)分割到time數(shù)組內(nèi),并顯示第二個(gè)數(shù)組元素18。
length 返回記錄的字符數(shù)
length( string )
length
實(shí)例:
awk '{ print length( "test" ) }' awk '{ print length }' testfile
第一個(gè)實(shí)例返回test字符串的長(zhǎng)度。
第二個(gè)實(shí)例返回testfile文件中第條記錄的字符數(shù)。
match 返回在字符串中正則表達(dá)式位置的索引,如果找不到指定的正則表達(dá)式則返回0。match函數(shù)會(huì)設(shè)置內(nèi)建變量RSTART為字符串中子字符串的開(kāi)始位 置,RLENGTH為到子字符串末尾的字符個(gè)數(shù)。substr可利于這些變量來(lái)截取字符串
match( string, regular expression )
實(shí)例:
awk '{start=match("this is a test",/[a-z]+$/); print start}' awk '{start=match("this is a test",/[a-z]+$/); print start, RSTART, RLENGTH }'
第一個(gè)實(shí)例打印以連續(xù)小寫(xiě)字符結(jié)尾的開(kāi)始位置,這里是11。
第二個(gè)實(shí)例還打印RSTART和RLENGTH變量,這里是11(start),11(RSTART),4(RLENGTH)。
toupper和tolower 可用于字符串大小間的轉(zhuǎn)換,該功能只在gawk中有效
toupper( string )
tolower( string )
實(shí)例:
awk '{ print toupper("test"), tolower("TEST") }'
標(biāo)簽:安康 鷹潭 淮安 上海 泰安 德宏 樂(lè)山 福州
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Linux中awk的使用方法詳解》,本文關(guān)鍵詞 Linux,中,awk,的,使用方法,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。