1劈伴、基本用法
awk [options] ‘program’ var=value file…
awk [options] -f programfile var=value file…
awk [options] 'BEGIN{ action;… } pattern{ action;… } END{ action;… }' file ...
awk程序通常由:BEGIN語句塊、能夠使用模式匹配的通用語句塊藤韵、END語句塊,共3部分組成
program通常是被單引號或雙引號中
?選項:
-F指明輸入時用到的字段分隔符
-v var=value: 自定義變量
awk的用法和sed很相似蛔屹,都自帶行的循環(huán)摹察,可以一行一行的讀取文件的內(nèi)容進(jìn)行處理泽谨,pattern指明處理哪一行,action匹配的內(nèi)容進(jìn)行什么處理動作夭谤。
sed [opption] 'script' file ,script=地址界定+命令
地址界定:1或者1,2或者1~2或者/pattern/或者/pattern1/,/pattern2/
pattern可以用正則表達(dá)式棺牧,表示匹配的行,或者匹配的第幾行到第幾行
awk [opption] 'program' file program=pattern+action
pattern也表示匹配的行朗儒,action表示對匹配的內(nèi)容進(jìn)行什么處理動作
2颊乘、基本格式
基本格式:awk [options] 'program' file…
?program:pattern{action statements;..}
?pattern和action:
?pattern部分決定動作語句何時觸發(fā)及觸發(fā)事件
BEGIN,END
?action statements對數(shù)據(jù)進(jìn)行處理参淹,放在{}內(nèi)指明
print, printf
?分割符、域和記錄
?awk執(zhí)行時乏悄,由分隔符分隔的字段(域浙值、列)標(biāo)記$1,$2..$n稱為域標(biāo)識。也就是$1代表第一列的值檩小,$2代表第二列的值开呐,$0為所有列,也就是整行规求。注意:和shell中變量$符含義不同
?文件的每一行稱為記錄筐付。
?省略action,則默認(rèn)執(zhí)行print $0 的操作
print格式:print item1, item2, ...
?要點:
(1) 逗號分隔符
(2) 輸出的各item可以是字符串阻肿,也可以是數(shù)值瓦戚;當(dāng)前記錄的字段、變量或awk的表達(dá)式
(3) 如省略item丛塌,相當(dāng)于print $0
3较解、awk工作原理
?第一步:執(zhí)行BEGIN{action;… }語句塊中的語句,執(zhí)行的時候還沒有讀入文件的內(nèi)容赴邻,和文件無關(guān)印衔,后面不用跟文件名也可以,常用于打印表頭姥敛。
?第二步:從文件或標(biāo)準(zhǔn)輸入(stdin)讀取一行奸焙,然后執(zhí)行pattern{ action;… }語句塊,它逐行掃描文件徒溪,從第一行到最后一行重復(fù)這個過程忿偷,直到文件全部被讀取完畢。
?第三步:當(dāng)讀至輸入流末尾時臊泌,執(zhí)行END{action;…}語句塊鲤桥,當(dāng)所有的行都處理完畢時執(zhí)行此語句塊,這里和文件有關(guān)系渠概,指的是文件所有行都處理完之后進(jìn)行的操作茶凳,后面要跟文件名,比如對所有的行進(jìn)行匯總操作播揪。
?BEGIN語句塊在awk開始從輸入流中讀取行之前被執(zhí)行贮喧,這是一個可選的語句塊,比如變量初始化猪狈、打印輸出表格的表頭等語句通诚渎伲可以寫在BEGIN語句塊中
?END語句塊在awk從輸入流中讀取完所有的行之后即被執(zhí)行,比如打印所有行的分析結(jié)果這類信息匯總都是在END語句塊中完成雇庙,它也是一個可選語句塊
?pattern語句塊中的通用命令是最重要的部分谓形,也是可選的灶伊。如果沒有提供pattern語句塊,則默認(rèn)執(zhí)行{ print }寒跳,即打印每一個讀取到的行聘萨,awk讀取的每一行都會執(zhí)行該語句塊
舉例
[root@centos6 app]#awk -F: '{print $1}' /etc/passwd ---只打印第一
列,-F指定輸入時用到的字段的分隔符
[root@centos6 app]#df |awk '{print $5}' ---沒有-F默認(rèn)空格做為分隔
符童太,并且空格可以為多個
Use%
3%
4%
1%
[root@centos6 sbin]#cat /etc/passwd|head -n2|awk -F: '{print $1,$3}'
---默認(rèn)是以空格做為輸出分隔符
root 0
bin 1
[root@centos6 sbin]#cat /etc/passwd|head -n2|awk -F: '{print $1$3}'
---如果什么都不加表示沒有分隔符
root0
bin1
[root@centos6 sbin]#awk -F: '{print $1"\t"$3}' /etc/passwd
---/t可以讓列對齊米辐,但前面的第一列太長的話也對齊不了,只是部分
對齊
root 0
bin 1
daemon 2
adm 3
[root@centos6 app]#df|awk '{print $1"---"$5}' ---可以指定輸出的分
割符书释,注意{}里面如果是變量不用雙引號翘贮,但如果是字符串要用雙引
號
Filesystem---Use%
/dev/sda2---3%
/dev/sda1---4%
/dev/sda3---1%
[root@centos6 app]#awk 'BEGIN{print 19/3}' ---BEGIN語句不需要
讀取文件內(nèi)容,與文件無關(guān)爆惧,執(zhí)行BEGIN語句時還沒有讀入文件內(nèi)
容择膝,只是打印表頭
6.33333
[root@centos6 app]#cat /etc/passwd |head -n1|awk -v FS=":" '{print $1,$3}' --- FS=":"是一個變量,指定輸入分隔符
root 0
[root@centos6 app]#cat /etc/passwd |head -n1|awk -v FS=":" '{print $1FS$3}' ---可以引用這個變量
root:0
[root@centos6 app]#fs=":";cat /etc/passwd |head -n1|awk -v FS=$fs '{print $1FS$3}'
root:0
[root@centos6 app]#cat /etc/passwd |head -n1|awk -v FS=":" -v OFS="---" '{print $1,$3}' ---定義變量指定輸入和輸出分隔符
root---0