AWK是一種優良的文本處理工具。它不僅是 Linux 中也是任何環境中現有的功能最強大的數據處理引擎之一。下面讓我們一起來學習這個強大工具的使用把!!!,
1) 基本語法格式
awk [options] 'action' file file
awk [options] 'PATTERN{action}' file file.....
2) awk的輸出方式
#==============
print [item1,item2...]
如果item被省略,則默認輸出整行,即爲$0,
如果想輸出空白,使用print “”
#===============
printf “format”, item.....
注意:默認不會自動換行,需要換行要使用/n
format中可以使用的修飾符
%c:顯示爲accii碼
%d,%i:顯示十進制整數
%e,%E:科學計數法顯示
%f:顯示浮點數
%g,%G:以科學計數法格式或浮點數格式顯示數值
%u:顯示無符號整數
%s:顯示字符串
%%:顯示一個”%”
修飾符格式控制字符(用在%和字母中間,如%20s)
#:顯示#個字符的寬度
#.*:*表示數值類型取值精度
-:左對齊,默認爲右對齊
+:顯示數值符號
3) awk的輸出重定向
print items > output-file
print items >> output-file
print items | command
特殊文件描述符:
/dev/stdin: 標準輸入
/dev/stdout: 標準輸出
/dev/stderr: 錯誤輸出
4) awk的操作符
算數運算符
x+y:加法運算 x-y:減法運算 x*y:乘法運算 x/y:除法運算 x%y:取模 x**y,x^y:x的y次方
| 賦值操作符:
= :將後邊的值賦值給前邊 x+=y : x-=y: *= /= %= ^=;**= ++ --
|
比較操作符: < :小於 <= :小於等於 > :大於 >= :小於 == :等於 != :不等於 ~:模式匹配,左邊的字符串能夠被右邊的模式所匹配爲真,否則爲假; !~:模式匹配,左邊的字符串能夠被右邊的模式所匹配爲假,否則爲\真; | 邏輯操作符: ||:或操作,如果前邊爲真,則執行後後邊的語句 &&:與操作;如果前邊爲假,則執行後邊的語句 |
字符串運算 連接
| |
條件表達式: A?B:C:如果A條件成立,則執行B,否則執行C語句 | |
函數調用方式: fuction_name(arg1,[arg2][,....]) |
5) awk中的模式:
正則表達式:格式爲/PATTERN/
僅處理被pattern匹配到的行
Expression::表達式,其結果爲非零或非空字符串時滿足條件
僅處理滿足條件的行
Ranges:行範圍,startline,endline僅
處理範圍內的行
BEGIN/END:特殊模式,
僅在awk的progream運行前BEGIN或運行後END執行一次
Empty:空模式,
匹配任意行,
6) awk常見的action
.Exporessions
.控制語句
.組合語句
.輸入語句
.輸出語句
7) awk中的控制語句
1.if-else語句
if (判斷語句){條件爲真語句} else {條件爲假語句}
2.while語句
while (判斷語句) {循環體}
循環,直到條件不滿足位置
3.di-while語句
do {循環體} while (判斷語句)
先執行一遍循環體,再進行判斷是否進入循環,直到條件不滿足時跳出循環
4.for循環
for (變量定義;判斷條件;修正語句){循環體}
執行順序爲:定義變量-->判斷條件-->條件爲真-->執行循環體 -->修正語句 -->跳轉到條件判斷
┗->條件爲假,跳出循環
5.case語句
swatch (expression) {case Value:語句;case /Expression/:語句2.......default:語句N}
6.循環控制語句
break:提前跳出循環
continue:提前跳出本輪循環,進入下一輪循環
7.next
提前跳出對本行的處理,轉而對下一行進行處理
8) 數組
關聯數組
arrary_name[下標]
下標可以使用任意字符串; 如果某數組元素事先不存在,那麼在引用時,awk會自動創建此元素並將其初始化爲空串;因此,要判斷某數組是否存在某元素,必須使用“index in array”這種格式進行判斷
在關聯數組中要遍歷數組中的每一個元素,需要使用如下特殊結構:
for (var in array) {for body}
數組元素的刪除
delete arrary_name[下標]
9) awk中的一些內置函數
split(字符串,數組名[,分隔符])
如果沒有指定分隔符,默認爲FS
此函數的返回值爲切片後的元素格式
length(String)
返回字符串的長度
substr(String,Start[,Length])
取字符串中的子串,從Start開始取String長度爲Length的字符串
10) 兩個AWK小例子
#返回當前各種類型的TCP連接的個數 [root@host1 ~]# netstat -tnap |awk '/^tcp/{state[$6]++}END{for (i in state) {print i,":",state[i]}}' ESTABLISHED : 1 LISTEN : 10 #返回每個IP地址的連接數 [root@host1 ~]# netstat -tn | awk '/^tcp/{split($5,ip,":");ipsum[ip[1]]++}END{for (i in ipsum) {printf "%s\t%s\n",i,ipsum[i]}}' 172.16.21.2514 #格式控制字符的使用 [root@host2 tawk 'BEGIN{printf "%15s %s\n","abcde","12345"}' abcde 12345 [root@host2 test]# awk 'BEGIN{printf "%-15s %s\n","abcde","12345"}' abcde 12345