原文地址:http://www.cnblogs.com/verrion/p/awk_usage.html
Awk使用說明
運維必須掌握的三劍客工具:grep(文件內容過濾器),sed(數據流處理器),awk(報表生成器),該文檔大致講述一下awk語法和在日常運維工作中使用awk帶來的好處和效率。再感歎一下awk實在是太強大了,完全是一門編程語言!(網上awk資料很多,自己整理Mark一下)
提示:Linux使用的gawk
官方解釋:gawk - pattern scanning and processing language
[root@test ~]# ll /bin/awk
lrwxrwxrwx. 1 root root 4 Mar 16 2016 /bin/awk -> gawk
語法格式
awk [ POSIX or GNU style options ] 'program-file/script' file ...
awk [ POSIX or GNU style options ] 'program-text/PATTERN {action}' file ...
下面一一講解各個參數的含義和用法
一:Options
參數選項,個人理解為打印報表輸出指定哪種屬性,一般用的最多的就是-F、-v兩個參數
-F/--field-separator:Use fs for the input field separator.(分隔符文本切割字符串)
該參數支持各種表達式,包括正則表達式 如:-F "^m"
舉例:ifconfig eth0 | awk -F "addr:| Bcast:" 'NR==2{print $2}'
-v:Assign the value val to the variable var, before execution of the program begins.
Action內部可以引用腳本外的變量
舉例:awk -v var="verrion" 'BEGIN{print var}'
二:行為模式
'program-text/PATTERN {action}':必須用單引號引用,中間的模式和action完全是一門編程語言,語法和其他編程或腳本語言類型,具有變量、邏輯語句等。
1、PATTERN模式
'program-text/pattern {action}'
模式類型
解釋說明
舉例
empty
空模式:匹配任意輸入行
awk -F: '{print $1}' /etc/passwd
RE
正在表達式:格式為/regular expression/
awk -F: '/^m/{print $1}' /etc/passwd
BEGIN/END
僅在awk命令執行時運行一次或者結束前運行一次
awk -F: 'BEGIN{un="Username";id="Id";shell="Shell";printf "%-10s%-10s%-20s\n",un,id,shell}{printf "%-10s%-10s%-20s\n",$1,$3,$7'} /etc/passwd
Expression
表達式:其值非0或非空字符時滿足條件
awk -F: '$1=="verrion"{print $1}' /etc/passwd
Ranges
指定范圍匹配:格式為pat1,pat2
awk -F: '/^r/,/^m/{print $1}' /etc/passwd
2、常見的action
分類
解釋說明
action類型
Action支持各種類型,如下:
expression表達式
regular expression正則表達式
Pattern expression模式匹配表達式
control statements控制語句
compound statements復合語句
Input statements輸入語句
Output statements輸出語句
下面語法會一一講解
模式
指定一個行的范圍,該語法不能包括BEGIN/END模式
BEGIN
讓用戶指定在第一條輸入記錄被處理之前所發生的動作,通常可在這裡設置全局變量
END
讓用戶在最後一條輸入記錄被讀取之後所發生的動作
3、語法如下
1)變量
要點
類型
說明
內置變量
記錄變量
FS:field separator,讀取文本時所使用的列分隔符
RS:Record separator,輸入文本信息所使用的行分隔符
OFS:Output field separator
ORS:Output record separator
如:awk -F: OFS="#" FS="#"
數值變量
NR:The number of input records;awk命令所處理的記錄數,如果有多個文件,這個數目會把處理的多個文件中讀取的行統一計數;
NF:number of field;當前記錄的field(列)個數;
FNR:與NR不同的是,FNR用於記錄的行數是當前文件的總讀取的行數;
ARGV:數組,保存命令行整個字符串,如awk '{print $0} test1.txt test2.txt'這個命令中,ARGV[0]保存awk,ARGV[1]保存test1.txt;
ARGC:awk命令參數的個數;
FILENAME:awk處理的文件名;
外來變量
自定義變量
用戶自定義自己的變量以便在程序或者腳本中使用,變量名命令規則和其他程序語言相同,只能以字母
數字和下劃線開頭,gawk變量名稱區分字符大小寫
在腳本中賦值變量
給變量賦值使用賦值語句進行,比如:
awk 'BEGIN{var="verrion";print var}'
在命令行中賦值變量
在腳本外為變量賦值,並在腳本中進行引用,比如:
awk -v var="verrion" 'BEGIN{print var}'
2)數組
要點
說明
解釋
表達式
array[index-expression]
可使用任意字符串,需要注意的是:如果某數組元素不存在,則自動創建此元素並初始化為空串;
下標值
不同之處
重點:不同於其他語言的數組,其下表值不止於數字,可以是字符串,同時每個下標值可以做累積
遍歷元素
For循環
for(var in array){statement,...}
其中var用於引用數組的下標,而不是元素
判斷元素
index in array
要判斷某數組中是否存在某元素,需要使用index in array方式
刪除數組
delete array[index]
從關系數組中刪除數組索引需要用delete命令
典型案例
語法for(i in array){statement1;statement2;....}
1.awk -F: '$NF!~/^$/{BASH[$NF]++}END{for(A in BASH){print "%15s;%i\n",A,BASH[A]}}' /etc/passwd
2.netstat -ant | awk '/^tcp/{++S[$NF]} END{for(a in S) print a,S[a]}'
3)操作符
類型
要點
說明
算法
數值運算
-x:負值 +x:轉換為數值 x^y或x**y:次方
x*y:乘法 x/y:除法 x+y:加法 x-y:減法 x%y:求余
字符串
字符串連接
只有一個,而且不用寫出來,用於字符串連接
比如:awk 'BEGIN{a="a";b="b";c=(a""b);print c}'
賦值
類似於算法操作
=:變量賦值 += -= *= /= %= ^= **=
++:自增
--:自減
需要注意的是:如果某模式為*號,此時使用/*/可能會有語法錯誤,應以/[*]/替代;
布爾值
True/false
任何非0值或非空字符串都為真,反之就為假;
比較
數值比較
字符串匹配
x<y x<=y x>y x>=y x==y x!=y
x~y y是個模式,x能被匹配到
x!~y 不匹配模式
邏輯關系
並且或者
&&:前一個條件滿足才執行後一個條件
||:前一個條件不滿足才執行後一個條件
條件表達式
復合表達式
selector?if-true-exp:if-false-exp
selector為真,執行if-true-exp,否則執行if-false-exp
函數調用
函數調用
function_name(argv1,argv2)
4)控制語句
表達式
語法
舉例
if-else
if(condtion){then-body}else{[eles-body]}
awk -F: '{if ($1=="root") print $1,"Admin";else print $1,"Common User"}' /etc/passwd
while
while(condtion){statement;....}
awk -F: '{i=1;while(i<=3){print $i,i++}}' /etc/passwd
do-while
do{statement;....}while(condtion)
awk -F: '{i=1;do {print $i,i++}while(i<=3)}' /etc/passwd
for
for(variable assignment;condtion;iteration process){statement;....}
awk -F: '{for(i=1;i<=3;i++)print $i}' /etc/passwd
case
switch(expression){case VALUE or /REGEXP/;statement1,statement2,...,default;statementN,...}
BEGIN {foo = 1;switch (foo) {case 3:print "x";break;case 2:print "y" ;break;case 1:print "z" ;break;default:print "default" ;}}
break和continue
常用於循環和case語句
awk -F: '{for(i=1;i<=3;i++)if($i==root)break;print $i}' /etc/passwd
next
提前結束對本行文字的處理,並接著處理下一行
awk -F: '{if($3%2==0)next;print $1,$3}' /etc/passwd
5)打印輸出
打印類型
使用方法
注意事項
prinf使用格式print item,....
1:各item之間使用逗號分開,而輸出以空白輸出;
2:輸出的item可以為字符串或數值,如記錄的字段(如$1),變量或awk的表達式,數值會先轉換為字符串,然後再輸出;
3:print後面的item可以省略,則如print $0,因此,如果想輸出空白行,則需要使用print ""
printf
printf使用格式:
printf format, item....
1:與print最大不同在於printf需要指定format;
2:format用於指定後面的每個item輸出格式;
3:printf不會自動打印換行符:\n
format格式的指示符都以%開頭,如下:
%c:顯示字符的ASCII碼;
%d,%i:十進制整數;
%f:顯示浮點數;
%s:顯示字符串;
%u:無符號整數;
%%:顯示%本身;
修飾符:
N:顯示寬度;
-:左對齊;
+:顯示數字符號;
如:%-10s 表示左對齊輸出長度10個的字符串
6)函數
類型
常用函數
舉例
內置函數
數值函數rand():返回0-1之間的一個隨機數
awk 'BEGIN{print rand()}'
length([s]):返回指定字符串的長度
awk -F: '{print length($1)}' /etc/passwd
sub(r,s,[t]):以r表示的模式來查找t所表示的字符中的匹配的內容,並將其第一次出現替換為s所表示的內容
awk -F: '{print sub(o,O,$1)}' /etc/passwd
gsub(r,s,[t]):以r表示的模式來查找t所表示的字符中的匹配的內容,並將其所有出現替換為s所表示的內容
ls -l /etc/hosts | awk -F "" '{gsub("r","4")};{gsub("w","2")};{gsub("x","1")};{gsub("-","0");print $2+$3+$4 $5+$6+$7 $8+$9+$10}'
split(s,a[,r]):以r為分隔符分割字符s,並將分割後的結果保存至a數組中,數組以下標為1開始的序列
netstat -ant | awk '/^tcp/{split($5,ip,":");count[ip[1]]++} END{for(i in count){print i,count[i]}}'
自定義函數
可以在引號中的任意地方定義,用{}表示塊整體,可以定義參數,但調用時可帶可不帶
用法如下:
awk '
function max(a,b,c)
{
return a>b?a:b
}
{print max($1,$2)}' file
說明:顯示每行前兩個域的較大值,max為函數名,a、b為參數
http://xxxxxx/Linuxjc/1161510.html TechArticle