一、awk介紹 全稱:由Aho Weinberger Kernaighan三個人的首字母組合而成 1970年第一次出現在Unix機器上,後來在開源領域使用它 awk是一種單獨的編程語言解釋器 awk報告生成器:通過模式匹配以及自己本身的語言格式,來獲取並輸出客戶所需要的內容 示例:獲取系統上面用戶i ...
一、awk介紹
全稱:由Aho Weinberger Kernaighan三個人的首字母組合而成
1970年第一次出現在Unix機器上,後來在開源領域使用它
awk是一種單獨的編程語言解釋器
awk報告生成器:通過模式匹配以及自己本身的語言格式,來獲取並輸出客戶所需要的內容
示例:獲取系統上面用戶id大於1小於等於500的用戶的用戶名和用戶ID
awk -F: '{if($3>=1&&<=500){print $1,$3}}' /etc/passwd
二、awk工作原理
1、依次把匹配到的行,使用awk工具進行編輯
2、$0表示整行,$1代表第一個…,$NF代表最後一個
3、pattern;通過模式匹配對應的欄位過濾行;
4、通過對應的命令 printf 做格式化輸出
三、awk用法
awk [option] … 'program' FILE
註意:
1、program 必須使用單引號
2、多條program語句使用大括弧包含起來,可以併列、嵌套
awk '{print}' /etc/passwd #預設列印$0
四、awk常見選項(option)
-F 指定分隔符,預設是空格
-F[:\] 指定多個分隔符
例: awk -F[:\] '{print $3,$5,$7}' /etc/passwd 指定 : 和 / 為分隔符
-v 手動指定變數參數
awk -v a="a/b" 'print a' a.txt
1、a是自定義變數
2、在awk中調用變數不用加$符號
cut與awk的區別
awk 以空格為分割域時,是以單個或多個連續的空格為分隔符的;
cut則是以單個空格作為分隔符。
五、awk的語法格式----program
1、print
預設輸出(在屏幕上)
在awk中沒有保存命令,我們可以關聯其他命令(tee)來保存
2、printf 實現格式化輸出
輸出格式:printf "xxx %-10s xxx %-10d ",name,num
格式符:
%s 顯示字元串
%d %i 顯示數值
%c 顯示ASCII
%e %E 科學計算方式
%f 顯示浮點數
%u 無符號整數
%% 逃逸符,只顯示%自己
修飾符:
預設為右對齊
- 代表左對齊
%5.4f 代表占位數為5,小數位有4位
3、變數
內置變數----環境變數(bash)
awk語言所預設支持的變數
FS 定義輸入分隔符的變數
OFS 定義輸出分隔符的變數
NF($NF) 分割以後的最後一列的變數,變數引用的時候不用加$
NR 定義文件的行數,定義多個文件的時候,行號疊加
FNR 定義文件行數時,只計算自己的行號
FILENAME 存儲文件名字
BEGIN 只執行一次後面的命令
awk 'BEGIN{print "xxx"}{print$3}' /etc/passwd
ARGC 整個 命令參數 的段數 不包含ARGC命令本身
ARGV 用來調取命令中指定的段
awk '{print ARGC}' /etc/passwd == 2 awk '{print ARGV[2]}' /etc/passwd == /etc/passwd
RS 指定換行符,預設為\n,可以指定新的換行符,不影響預設符號
ORS 輸出時替換預設換行符
awk -v ORS="@" '{print}' /etc/passwd
自定義變數
-v 變數=值
在後面’program’中去調用自定義變數時,直接使用即可或者將”變數=值”語句寫到program即可
4、模式匹配(地址定界)
a) 空值,沒有定義,預設就將文件中所有行放入awk中進行迴圈
b) 對m~n行進行操作
awk 'NR>=1&&NR<=3{print}' /etc/passwd 列印1到3行
c) pattern匹配的行 /pattern/
awk '/r..t/{print}' /etc/passwd
d) /pattern1/,/pattern2/ 第一次pattern1到第一次匹配pattern2的行
awk '/root/,/user1/{print}' /etc/passwd
練習:判斷/patern1/,/pattern2/之間行的用戶是bash用戶,並顯示用戶名
awk -F: '/^root/,/user1/{if($NF=="/bin/bash");print $1,$3}' /etc/passwd
e) 模式匹配可以直接使用判斷語句
awk -F: '$NF=="/bin/bash"{print $1 $3}' /etc/passwd
f) BEGIN定義在預設迴圈進行操作前所要執行的語句
awk -F: 'BEGIN{printf "shell程式為bash:\n"}$NF=="/bin/bash"{print $1,$3}' /etc/passwd
g) END 定義在迴圈結束後執行
awk -F: $NF=="/bin/bash"{print $1,$3} 'END{printf "end\n"}' /etc/passwd
5、操作符
運算操作符
+ - * / % ^(乘方) //
比較運算符
> < == != >= <= ~(等於) !~
awk -F: '-FS~"/bin/bash" {print $1,$3}' /etc/passwd
邏輯操作符
&& || !
賦值操作符
= += -= /= *= %= ^= //=
條件表達式
條件語句? 條件成立語句;條件不成立語句
awk '/^title/{NF<=2? print; print "參數過少"}' /boot/grub/grub.conf
6、常見action
print printf 以及它任何命令的操作都是action
a) expressions
b) input statements輸入語句
c) 組合語句 compound statements /pat1/{{ }{ }}
d) control statements 控制語句 例如 if while等
e) output statements 輸出語句
7、常見語言
a) if語句
語法格式:if(條件表達式){執行語句} else {執行語句}
awk '/^title/{if(NF<=2){print} else {print "error"}}' /boot/grub/grub.conf
b) while語句
只有對行參數進行遍歷的時候才使用while語句
語法格式:初始值 while(條件表達式){迴圈體;初始控制語句}
c) for語句
語法格式:for(初始值;條件判斷;初始值控制語句){迴圈體}
d) do-while語句
語法格式:do {迴圈體} while (迴圈條件)
e) 跳出迴圈語句
break [n] 跳出n次迴圈
continue 跳出本次迴圈
next 跳出預設的當前迴圈 NR%2==1 next 跳過奇數行
awk '{if(NR%2==1){next}else{print}}' /etc/passwd
f) switch語句(類似case)
語法格式:switch(表達式){case 模式匹配值:執行語句;case …,default:執行語句}
8、數組
在awk中,數組和shell中的數組特性相同
註意:awk中數組不用定義,只要使用,就有值為空的預設數組
行遍歷:整個文件進行遍歷
列遍歷:取對象的某一列進行遍歷
註意:數組通過for語句,再給其他變數進行賦值時,賦的是索引信息
練習:統計/etc/fstab中每個單詞(以空格隔開的詞)的次數
awk -v RS=" " '{print}' /etc/fstab | awk '{a[$1]++}END{for(i in a){printf "%-50s = %-2d\n",i,a[i]}}'
9、函數
內置函數:
length() 統計字元串長度
數學上使用的函數 sin() cos() tan() …
sub(x,x,x) 替換第一個匹配到的值
awk -F: '{print sub(o,O,$1) }' /etc/passw第一列第一個o替換為O
gsub(x,x,x) 替換該行所有匹配到的所有值
awk -F: '{print gsub(o,O,$1) }' /etc/passwd第一列所有o替換為O
split(x,x,x) 指定分隔符去切割文件
netstat -tan | awk '/^tcp\>/{split($5,ip,":");print ip[1]}'