推薦:天天一個 Linux 命令(3):sedlinux
Awk pattern scanning and processing language,對文本和數據進行處理。正則表達式
awk 是一種編程語言,用於在linux/unix下對文本和數據進行處理。數據能夠來自標準輸(stdin)、一個或多個文件,或其它命令的輸出。它在命令行中使用,但更可能是做爲腳原本使用。awk有不少內建的功能,好比數組、函數等,這是它和C語言的相同之處,靈活性是awk最大的優點。編程
awk [options] 'scripts' var=value filename
-F 指定分隔符(能夠是字符串或正則表達式) -f 從腳本文件中讀取awk命令 -v var=value 賦值變量,將外部變量傳遞給awk
awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' filename
一個awk腳本一般由BEGIN語句+模式匹配+END語句三部分組成,這三部分都是可選項.數組
工做原理:app
實例展現:編程語言
echo "hello " | awk 'BEGIN{ print "welcome" } END{ print "2017-08-08" }' welcome 2017-08-08 echo -e "hello" | awk 'BEGIN{ print "welcome" } {print} END{ print "2017-08-08" }' welcome hello 2017-08-08 #不加print參數時默認只打印當前的行 echo|awk '{ a="hello"; b="nihao"; c="mingongge"; print a,b,c; }' hello nihao mingongge #使用print以逗號分隔時,打印則是以空格分界 echo|awk '{ a="mgg"; b="mingg"; c="mingongge"; print a" is "b" or "c; }' mgg is mingg or mingongge #awk的print語句中雙引號其實就是個拼接做用
內置變量函數
$0 #當前記錄 $1~$n #當前記錄的第N個字段 FS #輸入字段分隔符(-F相同做用)默認空格 RS #輸入記錄分割符,默認換行符 NF #字段個數就是列 NR #記錄數,就是行號,默認從1開始 OFS #輸出字段分隔符,默認空格 ORS #輸出記錄分割符,默認換行符
外部變量spa
[mingongge@ ~]#a=100 [mingongge@ ~]#b=100 [mingongge@ ~]#echo |awk '{print v1*v2 }' v1=$a v2=$b 10000
算術運算符命令行
+ - 加減 * / & 乘 除 求餘 ^ * 求冪 ++ -- 增長或減小,做爲前綴或後綴
[mingongge@ ~]#awk 'BEGIN{a="b";print a,a++,a--,++a;}' b 0 1 1 [mingongge@ ~]#awk 'BEGIN{a="0";print a,a++,a--,++a;}' 0 0 1 1 [mingongge@ ~]#awk 'BEGIN{a="0";print a,a++,--a,++a;}' 0 0 0 1 #和其它編程語言同樣,全部用做算術運算符進行操做,操做數自動轉爲數值,全部非數值都變爲0
賦值運算符unix
= += -= *= /= %= ^= **=
正則運算符
~ !~ 匹配正則表達式/不匹配正則表達式
邏輯運算符
|| && 邏輯或 邏輯與
關係運算符
< <= > >= != =
其它運算符
$ 字段引用 空格 字符串連接符 ?: 三目運算符 ln 數組中是否存在某鍵值
^ 行首定位符 $ 行尾定位符 . 匹配任意單個字符 * 匹配0個或多個前導字符(包括回車) + 匹配1個或多個前導字符 ? 匹配0個或1個前導字符 [] 匹配指定字符組內的任意一個字符/^[ab] [^] 匹配不在指定字符組內的任意一個字符 () 子表達式 | 或者 轉義符 ~,!~ 匹配或不匹配的條件語句 x{m} x字符重複m次 x{m,} x字符至少重複m次 X{m,n} x字符至少重複m次但不起過n次(需指定參數-posix或--re-interval)
awk –F : ‘{print $2}’ datafile #以:分隔打印第二列 awk –F : ‘/^Dan/{print $2}’ datafile #以:分隔打印以Dan開頭行的第二列內容 awk –F : ‘/^[CE]/{print $1}’ datafile #打印以C或E開頭行的第一列 awk –F : ‘{if(length($1) == 4) print $1}’ datafile #打印以:分隔且長度爲4字符的第一列內容 awk –F : ‘/[916]/{print $1}’ datafile #匹配916的行以:分隔打印第一列 awk -F : '/^Vinh/{print "a"$5}' 2.txt #顯示以Dan開頭行並在第五列前加上a awk –F : ‘{print $2」,」$1}’ datafile #打印第二列第一列並以,分隔 awk -F : '($5 == 68900) {print $1}' 2.txt #以:分隔打印第五列是68900的行第一列 awk -F : '{if(length($1) == 11) print $1}' 2.txt #打印以:分隔且長度爲4字符的第一列內容 awk -F : '$1~/Tommy Savage/ {print $5}' 2.txt awk -F : '($1 == "Tommy Savage") {print $5}' 2.txt #打印以:分隔且第一列爲Tommy Savage的第五列內容 ll |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ",size}' #統計目錄個的文件全部的字節數 awk 'BEGIN{size=0;} {size=size+$5;} END{print "[end]size is ",size/1024/1024,"M"}' #以M爲單位顯示目錄下的全部字節數 awk 'BEGIN{a=10;a+=10;print a}' 20 #a+10等價於 a=a+10 echo|awk 'BEGIN{a="100testaaa"}a~/test/{print "ok"}' #正則匹配a 是否有test字符,成立打印ok awk 'BEGIN{a="b";print a=="b"?"ok":"err"}' ok awk 'BEGIN{a="b";print a=="c"?"ok":"err"}' err #三目運算符?: awk '/root/{print $0}' passwd #匹配全部包含root的行 awk -F: '$5~/root/{print $0}' passwd # 以分號做爲分隔符,匹配第5個字段是root的行 ifconfig eth0|awk 'BEGIN{FS="[[:space:]:]+"} NR==2{print $4}' #打印IP地址 awk '{print toupper($0)}' test.txt #toupper是awk內置函數,將所小寫字母轉換成大寫