awk應用linux
awk [options] 'script' var=value file(s)
awk [options] "PATTRN {'aciton'}" file(s)
經常使用命令選項正則表達式
-F fs fs指定輸入分隔符,fs能夠是字符串或正則表達式,如-F:shell
-v var=value 賦值一個用戶定義變量,將外部變量傳遞給awkexpress
-f scripfile 從腳本文件中讀取awk命令數組
-m[fr] val 對val值設置內在限制,-mf選項限制分配給val的最大塊數目;-mr選項限制記錄的最大數目。這兩個功能是Bell實驗室版awk的擴展功能,在標準awk中不適用。tcp
awk 'program' input-file1 input-file2url
其中program爲:spa
pattern{action}.net
pattern{action}命令行
(一)常見的模式類型
一、正則表達式:格式爲/regular expression/
二、表達式:其值非0或非空字符串時知足條件,如:$1 ~/foo/ ,用運算符~(匹配)和~!(不匹配)
三、範圍:指定匹配範圍,格式:awk -F '/^r/,/^m/{print $1,$2}' /etc/passwd 以r開頭到m開頭截止
四、BEGIN/END:特殊模式,僅在awk命令前運行一次或結束前運行一次
五、空模式:匹配任何數行
(二)常見的action
一、表達式,判斷表達式等
二、控制語句(if,for等)
三、複合語句:重定向到其餘文件
四、輸入輸出語句
(一)print輸出
格式:print item1,item2 ,...
要點:
一、各項目之間用逗號隔開,而輸出時則以空白字符分隔;
二、輸出的item能夠是字符串或數值、當前記錄的字段(如$1)、變量或awk的表達式;數值會轉換爲字符串再輸出;
三、print命令後面的item能夠省略,此時至關於 print $0;若是想輸出空白行,則需使用print "";
例子:
#awk 'BEGIN{print "how are you"}'
awk -F: '{print $1,$2}' /etc/passwd
分析:print中的$0表示本身,$1表示awk切分的片爲第1片,$2爲第2片。
(二) awk變量
2.一、awk內置變量之記錄變量
FS:讀取文檔時,所使用的字段分隔符,默認爲空白字符。
OFS:打印輸出時,所使用的字段分隔符,默認爲空白字符。
RS:輸入文本信息時所使用的換行符,默認是"\n"
ORS:打印輸出時所使用的換行符,默認是"\n"
例子:
awk 'BEGIN(OFS="\t")'{print $1 ,$2} /etc/passwd
2.二、awk內置變量之數據的變量
NR:命令所處理的記錄數:若是有多個文件,這個數目會把處理的多個文件中行統一計數;
FNR:與NR不一樣的是,FNR用於記錄正處理的行,是當前這一文件中總共處理的行數;
NF:當前記錄的字段個數
ARGV:數組,保存命令自己這個字符串;
如:awk '{print $0}' a.txt b.txt 這個命令中,ARGV[0]保存awk,ASGV[1]保存a.txt
ARGC: awk命令的參數個數
FILENAME: awk命令所處理的文件名稱
ENVIRCN:當前shell環境變量及值的關聯數組
如:awk 'ENGIN{print ENVIRCN["PATH"]}'
2.三、用戶自定義變量
awk容許用戶自定義本身的變量在程序代碼中使用,變量名規則是隻能使用字母、數字和下滑線,數字不能開頭。區分大小寫。
2.3.1 在腳本中賦值變量
在awk中給變量賦值:
例:
awk 'BEGIN{var ="good";print var}'
2.3.2 在命令行中使用賦值變量
awk能夠在"腳本"外爲變量賦值,並在腳本中引用。例如:上述可改成:
awk -v var="good" 'BEGIN{print var}'
printf命令使用格式:
printf format ,item1,item2,..
要點:
一、printf 須要指定format(格式);
二、format用於指定後面每一個item的輸出格式;
三、printf語句不會自動打印換行符:\n
format格式指示符(以%開頭後跟一個字符):
%c:顯示字符
%s:顯示字符串
%d,%i:十進制數
%e,%E:科學計數法
%f:浮點數
%g,%G:以科學計數法的格式或浮點格式顯示數值
%u:無符號整數
%%:顯示自身
修飾符:
N:顯示寬度
-:左對齊,默認是右對齊
+:顯示數值符號
例子:
awk -F: '{printf "%-15s %i\n",$1,$3}' /etc/passwd
print items > output-file
print items > output-file
print items | command
特殊文件描述符:
/dev/stdin: 標準輸入
/dev/stdout:標準輸出
/dev/stderr:錯誤輸出
/dev/fd/N:某特定文件描述符,如/dev/stdin 就至關於/dev/fd/0
例子:
awk -F:'{printf "%15s %i\n",$1,$2 >"/dev/sderr"}' /etc/passwd
注意:> < 能夠做爲字符串比較,也能夠用做數值比較,關鍵看操做數若是是字符串就會轉換爲字符串比較。兩個都爲數字才轉爲數值比較。字符串比較:按照ASCII碼順序比較。
(一)、數組的定義
array[index-expression]
一、數字作數組下標
Arr[1]="sun"
Arr[2]="uu"
二、字符串作數組下標
Array["first"]="www"
Array["last"]="name"
Array["birth"]="1987"
index-expression能夠是任意字符串,須要注意的是若是某數據組元素事先不存在,那麼在其引用時,awk會自動建立次元素並初始化爲空字符串,所以要判斷某數據組中使用index in array方式
要遍歷數組中每個元素,須要使用以下結構:
for (var in arrar) {statement1,...}
其中 var用於引用數組下標,而不是元素值;
例子:
netstat -ant | awk '/^tcp/ {S[$NF]++} END{for (a in S ) print a,S[a]}'
每出現一次/^tcp/模式匹配到的行,數組S[$NS]就加1,NF爲當前行的最後一個字段,此處用其值做爲數組S的元素索引;
awk '{counts[$1]++}END {for(url in counts) print counts[url],url}' /var/log/httpd/access_log
(二)刪除數組
delete array[key]
能夠刪除,對應數組key的,序列值。
例:
awk 'BEGIN{t1["a"]="a",t1["b"]="b"} delete t1["a"] END{for(k in t1) print t1,t1[k]}'
每條命令語句後面能夠用;分號結尾。
條件判斷語句
if(表達式)
{語句1}
else if(表達式)
{語句2}
else
{語句3}
例子:
awk 'BEGIN{ test=100;
if(test>90)
{ print "very good";
}
else if(test>60)
{ print "good"; }
else
{ print "no pass";
}
}'
循環語句
while語句
while(表達式)
{語句}
例子:
awk 'BEGIN{ test=100; total=0; while(i<=test){ total+=i; i++; } print total; }' 5050
for循環
for循環有兩種格式:
格式1
for(變量 in 數組)
{語句}
例1:
awk 'BEGIN{
name[1]="aa",
name[2]="bb"
}
END{
for (k in name){
print name[k],k
}
}'
例2
awk 'BEGIN{
for(k in ENVIRON){
print k"="ENVIRON[k];
}
}'
TERM=linux
G_BROKEN_FILENAMES=1
SHLVL=1 pwd=/root/text
...
logname=root
HOME=/root
SSH_CLIENT=192.168.1.21 53087 22
注:ENVIRON是awk常量,是子典型數組。
格式2:
for(變量;條件;表達式)
{語句}
例:
awk 'BEGIN{ total=0; for(i=0;i<=100;i++){ total+=i; } print total; }' 5050
do循環
do {語句}
while(條件)
例:
awk 'BEGIN{ total=0; i=0; do {total+=i;i++;} while(i<=100) print total; }' 5050
其餘語句
break 當 break 語句用於 while 或 for 語句時,致使退出程序循環。
continue 當 continue 語句用於 while 或 for 語句時,使程序循環移動到下一個迭代。
next 能可以致使讀入下一個輸入行,並返回到腳本的頂部。這能夠避免對當前輸入行執行其餘的操做過程。
exit 語句使主輸入循環退出並將控制轉移到END,若是END存在的話。若是沒有定義END規則,或在END中應用exit語句,則終止腳本的執行。更多:http://man.linuxde.net/awk#awk命令格式和選項