awk命令小結
阿新 • • 發佈:2018-07-15
固定 分隔符 出現 bbbb lee lse 長度 結束 .com 先在此至敬朱雙印老師,博客寫得很詳細:http://www.zsythink.net/archives/tag/awk/ 這是朱雙印老師關於awk博客的鏈接,強力推薦給大家
AWK一般在網上說是一種處理文本文件的語言,也是一個強大的文本分析工具。
雖然我也認同這種說法,但是在此我的認知是:
awk是逐行處理文本文件的語言/分析工具
從上面朱老師的圖中可以看到,$0表示整行,其它的就是以分隔符進行劃分的了
命令參數格式
#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
從上面朱老師的圖中可以看到,$0表示整行,其它的就是以分隔符進行劃分的了
awk命令小結