1. 程式人生 > >awk命令小結

awk命令小結

固定 分隔符 出現 bbbb lee lse 長度 結束 .com

先在此至敬朱雙印老師,博客寫得很詳細:http://www.zsythink.net/archives/tag/awk/ 這是朱雙印老師關於awk博客的鏈接,強力推薦給大家 AWK一般在網上說是一種處理文本文件的語言,也是一個強大的文本分析工具。 雖然我也認同這種說法,但是在此我的認知是: awk是逐行處理文本文件的語言/分析工具
技術分享圖片 技術分享圖片 從上面朱老師的圖中可以看到,$0表示整行,其它的就是以分隔符進行劃分的了
變量名稱 代表意義
NF 每一行 ($0) 擁有的欄位總數
NR 目前 awk 所處理的是『第幾行』數據
FS 目前的分隔字節,默認是空白鍵
命令參數格式 #awk ‘條件類型1{動作1} 條件類型2{動作2} ...‘ filename -F 指定輸入分隔符【此處其實是可以使用多個分隔符進行分隔的,例:< awk -F ‘[-|]‘ ‘{print $3}‘ FileName>】 #cat /usr/local/mail/app/log/authenticator.log|grep ‘none‘|awk -F ‘[<>{}]‘ ‘{print $2,$4}‘ -v 【options】的一種,用於設置變量的值 -v OFS="+++" 【使用變量要配合-v選項】OFS可以設定awk的輸出分隔符 ARGC 命令行參數個數 ARGV 命令行參數排列 ENVIRON 支持隊列中系統環境變量的使用 FILENAME awk瀏覽的文件名 【顯示當前處理的文件名】 FNR 瀏覽文件的記錄數【如同時處理多個文件,會分別計算行數】 FS 設置輸入域分隔符,等價於命令行 -F選項 NF 瀏覽記錄的域的個數 NR 已讀的記錄數 ORS 輸出記錄分隔符【真正的輸出行分隔符】 RS 控制記錄分隔符 【默認是以換行作為行分隔,比如需要定義空格作為行分隔】 #BEGIN表示在開始逐行處理文件之前指定的動作 #END表示在結束逐行處理文件之後指定的動作 例: #awk ‘BEGIN{print "aaaa","bbbb"} {print $1,$2} END{print "cccc","dddd"}‘ test 分隔符: -F 進行定義 #awk -F# ‘{print $1,$2}‘ test #awk -F “#” ‘{print $1,$2}‘ test #awk -v FS=‘#‘ ‘{print $1,$2}‘ test awk支持的關系運算符 關系運算符 含義 用法示例
< 小於 x<y <= 小於等於 x<=y == 等於 x==y != 不等於 x!=y >= 大於等於 x>=y > 大於 x>y ~ 與對應 與此同時匹配則為真 x ~ /正則/ !~ 與對應的正則不匹配則為真 x !~ /正則/ awk 模式 1、空模式 2、關系運算模式 3、BEGIN/END模式 4、正則模式 5、行範圍模式 awk正則格式 awk使用的正則用法屬於“擴展正則表達式”,當使用{x,y}這咎次數匹配的正則表達式時,需要配合--posix選項或者--re-interval選項 #awk ‘/正則表達式/{}‘ filename 例: #awk -F ":" ‘BEGIN{printf "%-10s%-10s\n","用戶名","用戶ID"} /^zsy/{printf "%-10s\t%-10s\n",$1,$3}‘ /etc/passwd #awk ‘/\/bin\/bash$/{print $0}‘ /etc/passwd 《註意轉義字符》
#awk --posix ‘/he{2,3}y/{print $0}‘ test3 《註意需要使用--posix》 #awk --re-interval ‘/he{2,3}y/{print $0}‘ test3 《或者使用--re-interval》 awk行範圍模式 例:搜索某兩個內容之間出現的行 #awk ‘/正則1/,/正則2/{動作}‘ /some/file #awk ‘NR>=3 && NR<=6 {print $0}‘ filename 例:awk提取IP地址的一個示例 #awk --posix ‘$2~/192\.168\.[0-9]{1,3}\.[0-9]\.{1,3}/{print $1,$2}‘ filename awk中使用IF #awk -F ":" ‘{if($3<500){print $1,"系統用戶"} else{print $1,"普通用戶"} }‘ /etc/passwd #awk ‘BEGIN{ for(i=0;i<6;i++){if(i=3){continue}; print i}}‘ NEXT可以促使AWK不對當前行執行對應的動作,而直接處理下一行 #awk ‘{ if(NR==2){ next }; print $0}‘ test9 AWK數組 #awk ‘BEGIN{ a[1]="a1";a[2]="a2"; for(i=1;i<=2;i++){print i,a[i]} }‘ #awk ‘BEGIN{ a[1]="a1";a[2]="a2"; for(i in a){print i,a[i]} }‘ 統計某個IP出現的次數 #awk ‘{ count[$i]++} END{ for(i in count){print i,count[i]} }‘ test10 算數函數 rand函數、srand函數、int函數 rand函數生成隨機數,但是是固定的,需要結合srand 隨機一個數 #awk ‘BEGIN{print rand()}‘ #awk ‘BEGIN{srand(); print rand()}‘ 隨機一個數,並且乘以100 #awk ‘BEGIN{srand(); print 100*rand()}‘ 生成一個隨機數,乘以100,並且截取整數部分 #awk ‘BEGIN{srand(); print int(100*rand())}‘ 字符串函數 gsub 例:將第一列中的小寫字母“l"都替換成大寫字母”L",【$1表示第一列,如果刪除$1,則表示所有的均替換】 #awk ‘{gsub("l","L",$1);print $0}‘ test11 #awk ‘{gsub("[a-z]","6",$1);print $0}‘ test11 sub 表示替換指定範圍內第一次匹配到的符合條件的字符,使用方法與gsub一樣,不舉例 length 獲取指定字符串的長度,如果不傳入任何字符,則以$0作為參數 #awk ‘{for(i=1;i<=NF;i++){print $i,length($i)}}‘ test11 index獲取指定字符串位於整個字符串中的位置,示例:<如果不存在則返回0> #awk ‘{print index($0,"Lee")}‘ test11 split 將指定的字符串按照指定的分割符切割,將切割後的每一段賦值到數組的元素中,從而動態創建數組,示例如下: 並且split函數的返回值的內容是數組的長度: split分割後的數組的下標是從1開始 #awk -v ts="大娃;二娃;三娃" ‘ BEGIN{split(ts,huluwa,";"); for(i in huluwa){print huluwa[i]} } ‘ #awk -v ts="大娃;二娃;三娃" ‘BEGIN{ print split(ts,huluwa,";" )}‘ #awk -v ts="qq te ab th" ‘BEGIN{ arrlen=split(ts,arr," "); for(i=1;i<=arrlen;i++){print i,arr[i]} }‘ asort根據元素的值進行排序 #awk ‘BEGIN{ t["a"]=66;t["b"]=3; asort(t); for(i in t){print i,t[i]}}‘ #awk ‘BEGIN{ t["a"]=66;t["b"]=3; asort(t); for(i in t){print i,t[i]} }‘ #awk ‘BEGIN{ t["a"]=66;t["b"]=3; asort(t,newt); for(i in newt){print i,newt[i]} }‘ 三元運算 普通示例:獲取UID小於500的用戶,進行判斷是否是普通用戶 #awk -F ":" ‘{if($3<500){usertype="系統用戶"}else{usertype="普通用戶"};print $1,usertype}‘ /etc/passwd 三元運算的寫法 #awk -F ":" ‘{usertype=$3<500?"系統用戶":"普通用戶";print $1,usertype}‘ /etc/passwd #awk -F ":" ‘{$3<500?a++:b++} END{print a,b}‘ /etc/passwd 打印奇偶行<i初始值為0,再利用!進行取反> 打印奇數行 #awk ‘i=!i‘ test2 打印偶數行 #awk ‘!(i=!i)‘ test2

awk命令小結