awk 实例演示
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
一.參數(shù)解釋:
(1)-F fs or --field-separator fs :指定輸入文件折分隔符,fs是一個字符串或者是一個正則表達(dá)式,如-F:。 (2)-v var=value or --asign var=value :賦值一個用戶定義變量。 (3)-f scripfile or --file scriptfile :從腳本文件中讀取awk命令。 (4)-mf nnn and -mr nnn :對nnn值設(shè)置內(nèi)在限制,-mf選項限制分配給nnn的最大塊數(shù)目;-mr選項限制記錄的最大數(shù)目。這兩個功能是Bell實驗室版awk的擴(kuò)展功能,在標(biāo)準(zhǔn)awk中不適用。 (5)-W compact or --compat, -W traditional or --traditional :在兼容模式下運(yùn)行awk。所以gawk的行為和標(biāo)準(zhǔn)的awk完全一樣,所有的awk擴(kuò)展都被忽略。 (6)-W copyleft or --copyleft, -W copyright or --copyright :打印簡短的版權(quán)信息。 (7)-W help or --help, -W usage or --usage :打印全部awk選項和每個選項的簡短說明。 (8)-W lint or --lint :打印不能向傳統(tǒng)unix平臺移植的結(jié)構(gòu)的警告。 (9)-W lint-old or --lint-old :打印關(guān)于不能向傳統(tǒng)unix平臺移植的結(jié)構(gòu)的警告。 (10)-W posix :打開兼容模式。但有以下限制,不識別:/x、函數(shù)關(guān)鍵字、func、換碼序列以及當(dāng)fs是一個空格時,將新行作為一個域分隔符;操作符**和**=不能代替^和^=;fflush無效。 (11)-W re-interval or --re-inerval :允許間隔正則表達(dá)式的使用,參考(grep中的Posix字符類),如括號表達(dá)式[[:alpha:]]。 (12)-W source program-text or --source program-text :使用program-text作為源代碼,可與-f命令混用。 (13)-W version or --version :打印bug報告信息的版本。二.內(nèi)建變量
$0當(dāng)前記錄(這個變量中存放著整個行的內(nèi)容) 整行內(nèi)容 $1~$n當(dāng)前記錄的第n個字段,字段間由FS分隔 FS輸入字段分隔符 默認(rèn)是空格或Tab NF當(dāng)前記錄中的字段個數(shù),就是有多少列 NR已經(jīng)讀出的記錄數(shù),就是行號,從1開始,如果有多個文件話,這個值也是不斷累加中。 FNR當(dāng)前記錄數(shù),與NR不同的是,這個值會是各個文件自己的行號RS輸入的記錄分隔符, 默認(rèn)為換行符 OFS輸出字段分隔符, 默認(rèn)也是空格 ORS輸出的記錄分隔符,默認(rèn)為換行符 FILENAME當(dāng)前輸入文件的名字 SUBSEP:數(shù)組下標(biāo)分隔符三.條件判斷
1.單條件判斷:
要留意的一個地方:
if 條件后面的語句塊,如果是單個語句,可以省略花括號,如果是多個語句,必須用花括號
2.多條件判斷:
再如:
awk -F':' '{if($1=="apple"){$var=$2+50;print $var}else if ($1=="orange"){$var=$3+20;print $var}else if ($1=="pear"){$var=$3+30;print $var}}' face.txt
執(zhí)行結(jié)果如下:
四.循環(huán)結(jié)構(gòu)
1.for循環(huán)
for循環(huán)的圓括號中需要3個表達(dá)式,前兩個分別是初始化表達(dá)式和測試表達(dá)式,第3個則用于更新測試表達(dá)式所用的變量。在awk的for循環(huán)中,圓括號里的第一條語句只能初始化一個變量(C語言中與之對應(yīng)的語句則可以用逗號分隔的形式初始化多個變量)。
2.while循環(huán)
使用while循環(huán)的第一步是給一個變量設(shè)初值,然后在while表達(dá)式中測試該變量。如果求得表達(dá)式的值為真(非0),則進(jìn)入循環(huán)體執(zhí)行其中的語句。如果循環(huán)體內(nèi)有多條語句,就必須用花括號把這些語句括起來。循環(huán)塊結(jié)束之前,一定要更新用來控制循環(huán)表達(dá)式的變量,否則循環(huán)將無休止地進(jìn)行下去。do/while循環(huán)與while 循環(huán)很相似,唯一的區(qū)別在于do/while要先執(zhí)行循環(huán)體至少一次,然后才測試表達(dá)式。
五.BEGIN 與END語句
BEGIN 用于匹配輸入文件的第一行之前的位置, END 則用于輸出匹配文件處理過后的最后一行的形式。通常使用 BEGIN 來輸出一個標(biāo)題: 來顯示變量和預(yù)置(初始化)變量,使用END來輸出最終結(jié)果。
要注意的是: 此處例子的FS 分隔符要用雙引號括起來。用作數(shù)字的awk變量的默認(rèn)初始值為0,所以變量值為0的話就可以省略不寫? 。
再如:
六.拆分文件--根據(jù)某列的不同值進(jìn)行分類歸檔
1.根據(jù)指定列的值輸出全部內(nèi)容的值
命令語句:
netstat -nptoa |awk 'NR!=1{print >$6}' ?
說明:
NR!=1表示不處理表頭(首行),示例演示的功能是根據(jù)第六列的不同值取文件名,再將所有列的值輸出到先前不同文件名的文件里。
2.根據(jù)指定列的值定制輸出想輸出的列的內(nèi)容
命令語句:
netstat -anopt|awk 'NR!=1{print $4,$5 >$6}'
解說:
該條命令實現(xiàn)的功能就是根據(jù)第6列的不同狀態(tài)值取文件名,文件內(nèi)容只包含第4,5列的值
七.統(tǒng)計,計數(shù)
1.統(tǒng)計文件夾下某種文件類型的文件大小
2.統(tǒng)計每個用戶使用的內(nèi)存大小
命令語句:
ps aux|awk 'NR!=1{a[$1]+=$6}END{for (i in a) print i ":" a[i]"KB"}'
3.統(tǒng)計文件相同行的次數(shù)
命令語句:
A: ?awk -F'.' '{print $1}' 44.txt |awk -F '//' '{print $2}'|sort -nr|awk '{a[$1]++}END{for (i in a )print i,a[i]}'?
B: awk -F'.' '{print $1}' 44.txt |awk -F '//' '{print $2}'|sort -nr|awk '{a[$1]++}END{for (i in a ){print i, a[i]}}'
C: ?awk -F'.' '{print $1}' 44.txt |awk -F '//' '{print $2}'|sort -nr|awk '{a[$1]++}END{for (i in a )print i a[i]}'??
備注: 留意下這三條命令在輸出上的不同之處
4.刪除文件中的重復(fù)行
5.在awk里嵌入系統(tǒng)命令
命令語句:
awk '!/^$/{a[$7]++}END{for (i in a)printf "URL:%-20s count:%d\n",i ,a[i]|"sort -nr -t':' -k4 " }' 2017-02-16-0000-2330_gxxxx.cn.log |head -n5
如同所示: 在awk里嵌入系統(tǒng)命令,需用雙引號把系統(tǒng)命令引起來,單引號也不行。演示的功能是統(tǒng)計日志文件里各域名的次數(shù),并按逆序輸出
6.split函數(shù)
命令語句:
awk 'BEGIN{split("3/10/2017",date,"/");print "The month is "date[1] " and the year is "date[3]}'
數(shù)組與split函數(shù):?awk的內(nèi)置函數(shù)split能夠?qū)⒆址鸱譃樵~,然后保存在數(shù)組中。如未指定字段分隔符,也可以就用FS的當(dāng)前值。
格式
split(字符串,數(shù)組,字段分隔符)
split(字符串,數(shù)組)
說明:將字符串3/10/2017保存到數(shù)組date中,用正斜杠作為字段分隔符。現(xiàn)在date[1]中是3,date[2]中是10,而date[3] 中則是2017。字段分隔符用第3個參數(shù)指定,如未指定,就以FS的值做字段分隔符。
八.字符匹配
模糊匹配: ~ ?精確匹配: ?== ? 不匹配: ?!~ ? 不精確匹配: ?!==
轉(zhuǎn)載于:https://my.oschina.net/szwyh2014/blog/856741
總結(jié)
- 上一篇: 使用Ant实现打包jar包上传到服务器
- 下一篇: MaxCompute(原ODPS)使用总