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