摘要:使用中,需要處理的文件,逐行使用分隔符分割成若干個(gè)字段,稱之為域,分隔符默認(rèn)是空格,可使用選項(xiàng)來(lái)指定分隔符腳本模式將所需執(zhí)行的命令插入腳本文件,然后在首行設(shè)置命令解釋器為通過(guò)鍵入腳本名的方式調(diào)用。
博文參考
http://www.178linux.com/6553 http://baike.baidu.com/link?url=Y4lo-kWxygpw7NLaKTSehvpkAM7ogKA6GPVxaM23MMSzjmfsx4o3mey7-VVqu1pDhZJqa0sr7cJNhggIHC5JT_AWK簡(jiǎn)介
awk是一種模式掃描和處理工具,相對(duì)于grep的查找,sed的編輯,它在對(duì)數(shù)據(jù)進(jìn)行分析生成報(bào)表時(shí)顯得尤為強(qiáng)大。awk通過(guò)逐行遍歷一個(gè)或多個(gè)文件的方式,查找模式匹配到的行,而后以指定的分隔符(缺省為空格)進(jìn)行切片,然后針對(duì)切片數(shù)據(jù)進(jìn)行處理和分析。事實(shí)上,gawk有自己的語(yǔ)言,其本身就相當(dāng)于一個(gè)解釋器,允許用戶創(chuàng)建簡(jiǎn)短的程序讀取輸入文件,對(duì)輸入數(shù)據(jù)執(zhí)行排序、計(jì)算以及生成報(bào)表操作,甚至可以類似bash shell實(shí)現(xiàn)諸如循環(huán)、數(shù)組、條件判斷、函數(shù)、變量等功能,進(jìn)而完成更為復(fù)雜的數(shù)據(jù)分析處理任務(wù)。awk的使用方式
1、命令行方式:awk [-F field-separator] ‘COMMAND’inputfiles
//其中COMMAND是awk的執(zhí)行命令,用來(lái)處理數(shù)據(jù),[-F field-separator]是可選選項(xiàng),inputfiles是待處理文件。 //awk使用中,需要處理的文件,逐行使用分隔符分割成若干個(gè)字段,稱之為域,分隔符默認(rèn)是空格,可使用-F選項(xiàng)來(lái)指定分隔符
2、shell腳本模式
將所需執(zhí)行的awk命令插入awk腳本文件,然后在首行設(shè)置命令解釋器為#!/bin/awk,通過(guò)鍵入腳本名的方式調(diào)用。
awk基本用法3、所有awk命令寫(xiě)入到一個(gè)多帶帶的文件,當(dāng)處理同一類文件需求時(shí),使用awk -f awk-script inputfiles調(diào)用之,其中awk-script指awk腳本。
awk[OPTIONS]"program"FILE1 FILE2... program:PATTERN{ACTION STATEMENT} program:編程語(yǔ)言 PATTERN:模式 ACTION STATEMENT:動(dòng)作語(yǔ)句,可以有多個(gè)語(yǔ)句組成,各語(yǔ)句之間使用分號(hào)隔開(kāi);如:print,printf OPTIONS: -F[]:指明輸入字段分隔符 -v VAR_NAME=VALUE:變量賦值 -f /PATH/FROM/AWK_SCRIPT 指定腳本文件 awk處理文本按一行讀取,根據(jù)輸入分隔符切片(默認(rèn)為空格字符),切n個(gè)片,然后將每個(gè)片賦予awk內(nèi)部一個(gè)變量進(jìn)行保存,其這個(gè)過(guò)程變量名為$1,$2,$3...直到最后一個(gè),最后就可以對(duì)這些片多帶帶處理。print輸出命令
輸出默認(rèn)分割符:空白字符 item之間逗號(hào)分割 print " " 輸出空白字符print $0 輸出整行 awk [options] "BEGIN{action}pattern{action}END{action}" file awk 語(yǔ)法組成: BEGIN語(yǔ)句塊,能夠使用模式匹配的通用語(yǔ)句塊,END語(yǔ)句塊 awk執(zhí)行時(shí),由分隔符分割的字段(域)標(biāo)記$1,$2,$n為域標(biāo)識(shí),$0為所有域 文件的每一行稱為記錄 省略action默認(rèn)執(zhí)行print $0操作 pattern 模式 action 動(dòng)作;行為 row column 行,記錄 record field 列,域,字段
案例
[root@mm ~]#echo -e "hello,world hello world" >1.sh 基本輸出 [root@mm ~]#awk "{print $1}" 1.sh 引號(hào)的作用 [root@mm ~]#awk "{print "hi",$1}" 1.sh [root@mm ~]#awk "{print "hi:$1"}" 1.sh [root@mm ~]#awk "{print "hi:$1",666}" 1.sh 空白輸出 [root@mm ~]#awk "{print}" 1.sh [root@mm ~]#awk "{print ""}" 1.sh
變量awk默認(rèn)從鍵盤(pán)輸入,不管輸入什么,輸出都是hello
內(nèi)置變量: FS:輸出字段分割符,默認(rèn)空白 RS:輸入時(shí)的行分割符,默認(rèn)換行符 OFS:輸出時(shí)的字段分割符,默認(rèn)空白字符 ORS:輸出時(shí)的行分割符,默認(rèn)換行符 NF print NF:當(dāng)前行的字段數(shù) print $NF:顯示當(dāng)前行的第NF字段的值 NR:行數(shù);命令后跟的所有文件統(tǒng)一合并計(jì)算 FNR:行數(shù);個(gè)文件多帶帶計(jì)數(shù) FILENAME:當(dāng)前正被awk讀取的文件名 ARGC:awk命令行中的參數(shù)個(gè)數(shù) ARGV:數(shù)組,保存命令行參數(shù)本身 自定義變量:
awk -F: "END{print NF}" /etc/passwd #表示以:分割的有7段(顯示總字段) awk -F: "{print $(NF-1)}" /etc/passwd #取出最后一個(gè)字段的 awk -F: "{print NR,$1}" /etc/passwd #顯示行號(hào) awk "{print NR,$0}" /etc/issue /etc/fstab #兩個(gè)文件合并顯示行號(hào) awk "{print FNR,$0}" /etc/issue /etc/fstab #兩個(gè)文件分開(kāi)顯示行號(hào) awk "{print FNR,$0,FILENAME}" /etc/issue /etc/fstab 顯示文件名(FILENAME) awk "BEGIN{print ARGC}" /etc/issue /etc/fstab /etc/passwd #顯示給的參數(shù)個(gè)數(shù)(BEGIN只顯示一個(gè)參數(shù)) awk "BEGIN{print ARGC,ARGV[2]}" /etc/issue /etc/fstab /etc/passwd #根據(jù)參數(shù)的個(gè)數(shù)(索引)取出文件名([0]下標(biāo)是awk) awk "BEGIN{print ARGC,ARGV[ARGC-2]}" /etc/issue /etc/fstab /etc/passwd #倒著顯示給的參數(shù) awk "{sex="male";print sex}" /etc/passwd #打印變量自定義sex awk "END{sex="male";print sex}" /etc/passwd #打印最后一個(gè)sex awk "{sex="male";age=20;print sex,age}" /etc/passwd #必須先定義再使用,不然第一個(gè)定義不到
案例
[root@mm ~]#awk -F, "{print $1}" 1.sh [root@mm ~]#awk -v FS="," "{print $1}" 1.sh [root@mm ~]#awk -v FS="," "{print $1,$2}" 1.sh [root@mm ~]#awk -v FS="," -v OFS="&" "{print $1,$2}" 1.sh [root@mm ~]#awk -v RS=" " "{print $1}" 1.sh [root@mm ~]#awk -v RS=" " -v ORS="-" "{print}" 1.sh [root@mm ~]#awk "{print NF}" 1.sh [root@mm ~]#awk "{print $NF}" 1.sh [root@mm ~]#awk "{print NR}" 1.sh 2.sh [root@mm ~]#awk "{print FNR}" 1.sh 2.sh [root@mm ~]#awk "{print FILENAME}" 1.sh [root@mm ~]#awk "{print ARGC}" 1.sh [root@mm ~]#awk "{print ARGV[0]}" 1.sh [root@mm ~]#awk "{print ARGV[1]}" 1.sh [root@mm ~]#awk -v hi="hi bro" "{print hi}" 1.sh [root@mm ~]#awk "{hi="hi bro";print hi}" 1.shprintf輸出命令
%c:顯示字符ASCLL碼 %d,%i:十進(jìn)制整數(shù) %e,%E:科學(xué)計(jì)數(shù)法顯示數(shù)值 %f:浮點(diǎn)數(shù) %g,%G:科學(xué)計(jì)數(shù)法或浮點(diǎn)數(shù) 格式顯示數(shù)值 %s:字符串 %u:無(wú)符號(hào)整數(shù) %%:%符合本身
案例
[root@mm grub.d]#cat /etc/issue User:Centos,UID:6 User:Kernel,UID:0 User:, UID:0 User:CentOS release 6.6(Final) User:Kernel on an m User: awk -F: "{printf "User:%s ",$1}" /etc/issue User:%s 表示對(duì)后面$1的內(nèi)容以字符串形式顯示,并且在其前面加上User:字符串,同時(shí)結(jié)尾添加換行符 awk -F" " "{printf "User:%s,UID:%d ",$1,$3}" /etc/issue User:%s,UID:%d 表示對(duì)后面的$1的內(nèi)容以字符串的形式顯示,對(duì)$2后面內(nèi)容十進(jìn)制顯示,同時(shí)結(jié)尾添加換行符。 awk -F" " "{printf"User:%-15s,UID:%15d ",$1,$3}" /etc/issue 左邊一欄以左對(duì)齊方式顯示15個(gè)字符長(zhǎng)度,右邊欄以默認(rèn)對(duì)齊方式右對(duì)齊顯示15個(gè)字符的長(zhǎng)度 [root@mm ~]#awk -F, "{printf "first record:%s ",$1}" 1.sh
三目表達(dá)式{條件滿足 條件不滿足?滿足 執(zhí)行命令:不滿足 執(zhí)行命令;打印%15是占位符($1) %-s是占位符(usertype) n (換行符) :(冒號(hào)分割符)}
awk -F: "{printf "%s",$1}" /etc/passwd #%s占位符,%s后加/n換行 awk -F: "{printf "%s %4.2f ",$1,$3}" /etc/passwd #%s是$1占位符;%4.2f指2位小數(shù),$3的占位符 awk -F: "{printf "username:%-30s uid:%10d ",$1,$3}" /etc/passwd #username(顯示):(分割符)%-30s(%s是$1的占位符并且左對(duì)齊-30個(gè)字符) uid(顯示):%10d(%d是$3的占位符10右對(duì)齊) (換行)",$1,$3操作符
a.算數(shù)操作符 -x:負(fù)值 +x:轉(zhuǎn)化為數(shù)值 b.字符操作符 c.賦值操作符 =,+=,-=,*=,/=,%=,^=,++,-- d.比較操作符 >,>=,<,<=,==,!= awk -F: "!($3>=50){print $3}" /etc/passwd e.模式匹配配操作符 ~:是否能由右側(cè)指定的模式所匹配 ~!:是否不能由右側(cè)指定模式所匹配 f.邏輯操作符 &&:與運(yùn)算 awk -F: "$3>=0 && $3<=1000 {print $1}" /etc/passwd ||:或運(yùn)算 g.條件表達(dá)式 awk -F: "{$3>=500?usertype="Common User":usertype="Sysadmin or Sysuser";printf "%15s:%-s ",$1,usertype}" /etc/passwd h.函數(shù)調(diào)用
案例
[root@mm ~]#awk -F: "$3>=0 && $3<=1000 {print $1}" /etc/passwd [root@mm grub.d]#awk -F: "!($3>=50){print $3}" /etc/passwd [root@mm grub.d]#awk -F: "BEGIN{print "username uid ------------"}{print $1,$3}END{print"========="}" /etc/passwdPATTERN模式
1)empty:空模式,匹配所有行 2)/Regular Expression/:僅將ACTION應(yīng)用于能夠被Regular Expression所匹配到的行 awk -F: "/^[ab]/{print $1,$3}" /etc/passwd 3)relational expression:關(guān)系表達(dá)式,結(jié)果非0或非空字符串為真,否則為假; awk -F: "$3>=500{print $1,$3}" /etc/passwd awk -F: "$1~/root/{print $1,$3}" /etc/passwd 4)line ranges:行范圍 5)BEGIN/END BEGIN:格式化前用于輸出表頭或做一個(gè)預(yù)處理操作 END:格式化后用于輸出表尾或做出清理操作
案例
常用ACTION1)EXPRESSIONS:變量賦值 2)Control Statements:控制語(yǔ)句 3)Compound Statements:復(fù)合語(yǔ)句 4)input statements 5)output statements控制語(yǔ)句
第一中用法: 1)if-else awk -F: "{if($3>=500)print $1,$3}" /etc/passwd [root@mm ~]#awk "{if(NF>=6)print NF,$0}" /etc/passwd [root@mm ~]#awk "{if(NF>=6)print NF,$0}" /etc/passwd [root@mm ~]#awk -F: "{if($3>=500){print $1,"is a common user"} else {print $1,"is a sysadmin or sysuser"}}" /etc/passwd 2)while 循環(huán) awk "{i=1;while(i<=NF){if(length($i)>=6){print $i};i++}}" /etc/passwd 3)do-while 循環(huán) 4)for 循環(huán) awk "{for(i=1;i<=NF;i++){if(length($i)>=6)print $i}}" /etc/issue 第二中用法: 5)swtich 6)break and continue 7)next:提前結(jié)束本行處理;提前進(jìn)入下行處理操作 awk -F: "{if($3%2==0)next;print $1,$3}" /etc/passwd數(shù)組
關(guān)聯(lián)數(shù)組 index-expression:可以使用任意字符 數(shù)組遍歷函數(shù)
1)內(nèi)建函數(shù) 數(shù)值處理:rand():返回0至1之間的一個(gè)隨機(jī)數(shù) 字符串處理: length([s]):返回指定的字符串的長(zhǎng)度 sub(r,s[,t]): gsub(r,s[,t]): split(s,a[,r]): 2)用戶自定義函數(shù)
經(jīng)驗(yàn)
統(tǒng)計(jì)指定的web訪問(wèn)日志中各ip的資源訪問(wèn)次數(shù) awk "{ip[$1]++}END{for(i in ip)print i,ip[i]}" /var/log/httpd/access_log 統(tǒng)計(jì)當(dāng)前系統(tǒng)上所有tcp連接的各種狀態(tài)的個(gè)數(shù) ss -tan|awk "!/^State/{state[$1]++}END{for(i in state)print i,state[i]}"
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/40626.html
TCP/IP HTTP和HTTPS有何區(qū)別? httpbin 一個(gè)簡(jiǎn)單的HTTP請(qǐng)求和響應(yīng)服務(wù)。 TCP的三次握手與四次揮手 通俗易懂版,詳細(xì)版本 MySQL CHAR和VARCHAR存取的差別 《高性能MySQL》筆記 - MySQL 鎖的基本類型 MySQL中的鎖之一:鎖的必要性及分類 MySQL中的鎖之二:行鎖、頁(yè)鎖、表鎖 MySQL Like與Regexp的區(qū)別 數(shù)據(jù)結(jié)構(gòu) 數(shù)...
閱讀 3766·2021-11-24 09:39
閱讀 2966·2021-11-16 11:49
閱讀 2083·2019-08-30 13:54
閱讀 1109·2019-08-30 13:03
閱讀 1097·2019-08-30 11:10
閱讀 725·2019-08-29 17:10
閱讀 1253·2019-08-29 15:04
閱讀 1220·2019-08-29 13:02