1. 程式人生 > 其它 >linux三劍客之awk 文字分析工具

linux三劍客之awk 文字分析工具

目錄

linux三劍客之awk

定義 :主要用來格式化文字。

語法格式 : awk [引數] [處理規則] [操作物件]

引數 : -F  : 指定文字分隔符(預設是以空格作為分隔符的)
	
	例 : 列印系統所有使用者的解析器
		awk -F: '{print $NF}' /etc/passwd 
	

awk的生命週期

三劍客中: grep 、sed 、awk 都是讀一個處理一行 ,直至處理完成

生命週期:
	1、接受一行作為輸入
	2、把剛剛讀入進來得到文字進行分解
	3、使用處理規則處理文字
	4、輸入一行,賦值給$0,直至處理完成
	5、把處理完成之後的所有的資料交給END{}來處理
	

awk中的預定變數

$0  : 代表當前行
	例 : awk -F: '{print $0, "--"}' /etc/passwd  # 
	
$n  : 代表第n列
	例 :awk -F: '{print $1}' /etc/passwd  # 這就列印為第一列的內容	
	
NF  :記錄(統計)當前行的欄位數  (常與 $ 配合使用)
	例 : awk -F: '{print NF}' /etc/passwd  # 以 : 作為分割符 則列印每一行有多少列
	
$NF :$  :取變數裡的值 NF相當於統計欄位數  
	 $NF :就相當於取每一行的最後一個欄位(最後一列)的內容

NR  :用來記錄行號

FS  :指定文字分隔符 (預設為空格) # 相當於引數 -F 但是優先順序大於引數 -F
	[root@localhost ~]# awk 'BEGIN{FS=":"}{print $1, $NF}' /etc/passwd
相當於:
	[root@localhost ~]# awk -F: '{print $1, $NF}' /etc/passwd
	
OFS :指定列印分隔符 (預設為空格)
	[root@localhost ~]# awk -F: 'BEGIN{OFS=" >> "}{print $1, $NF}' /etc/passwd

awk處理規則的流程

# 處理流程至少有一個 所以開始必須為BEGIN()

BEGIN{}   : 最開始處理
//	  : 正則
{}  	  : 迴圈
END{} 	  : 列印之前整體的處理

awk中的函式

print   : 列印
printf  : 格式化列印
%s      : 字串
%d      : 數字
-       : 左對齊
+       : 右對齊
數字    :  至少佔用多少個字元

例題:

[root@localhost ~]# awk -F: 'BEGIN{OFS=" | "}{printf "|%-15s|%-15s|\n", $NF,$1}' /etc/passwd

解析 : awk 命令
	   -F: 指定分隔符為 :
	   BEGIN{OFS= " | "} : BEGIN處理流程第一步:指定列印分隔符為 |
	   {printf "|%-15s|%-15s|\n", $NF,$1}    :printf 格式化列印
	   					 :"" 外邊為單引號 內部則要用雙引
	   					 :%-15s : 左對齊字串至少佔用15個字元 
	   					 :\n 換行符
	   					 :$NF 取每一行的最後一段(最後一列)
	   					 :$1  取每一行的第一段(第一列)
		/etc/passwd : 路徑檔案
		

awk中的定位

1、正則表達值:
	例題:[root@localhost ~]# awk -F: '/root/{print $0}' /etc/passwd
	解析:// 中間為正則表示式 則就是匹配正則為root的行
2、比較表示式
	
	>	: 大於
	<	: 小於
	>=	: 大於等於
	<=	: 大於等於
	~ 	: 正則匹配
	!~	: 正則匹配(取反)
	
案例:

1、要求列印屬組ID大於屬主ID的行
	[root@localhost ~]# awk -F: '$4>$3{print $0}' /etc/passwd
	解析: 屬組ID在文字以: 分割在第4個欄位 屬主在第三個欄位 所有比較這兩個欄位就可以
	
2、列印結尾包含bash
	[root@localhost ~]# awk -F: '$NF ~ /bash/{print $0}' /etc/passwd
	
3、邏輯運算子

&&	:	與
||	:	或
!	:	非
例題:
	
1、打印出屬主屬組都大於0的使用者
	[root@localhost ~]# awk -F: '$4>0 && $3>0' /etc/passwd

2、打印出屬主屬組相加大於1000或者 屬主屬組相乘大於1000的使用者
	[root@localhost ~]# awk -F: '$4+$3>1000 || $4*$3>1000' /etc/passwd
	
3、打印出屬主屬組相加不大於
	[root@localhost ~]# awk -F: '!($4+$3>1000 || $4*$3>1000)' /etc/passwd
4、算數表示式
	
	+       相加
	-	相減
	*	相乘
	/	相除
	%	取餘
	
案例:

1、要求打印出偶數行
	[root@localhost ~]# awk -F: 'NR % 2 == 0{print $0}' /etc/passwd
	解析 : NR統計行 行除以2取餘 餘數為0則為偶數

2、要求打印出計數行
	[root@localhost ~]# awk -F: 'NR % 2 == 1{print $0}' /etc/passwd
5、條件表示式
	
	== 
	>
	<
	>=
	<=
	
# 其實比較表示式也相當於條件表示式

案例:
	
	要求列印某一行內容:
		[root@localhost ~]# awk -F: 'NR == 3{print $0}' /etc/passwd
		# 運用 == NR == 3 則列印第三行內容
		

6、範圍表示式
	
前一段	,後一段 : 表示前一段至後一段的範圍

案例:
	打印出開頭為root 到 開頭為ftp 的內容

流程控制

只存在迴圈{}之中

作用相當於python中的但格式不一樣。

if 		: 判斷
for		: 迴圈
while		: 迴圈

if :

	if(){}
	if(){}else if(){}
	if(){}else(){}

	[root@localhost ~]# awk -F: '{if($3>$4){print "大於"}else{print "小於或等於"}}' /etc/passwd
	
for :
	
	for(i="初始值";條件判斷;遊標){}

	[root@localhost ~]# awk -F: '{for(i=5;i>0;i--){print $0}}' /etc/passwd
	
	# 每一行迴圈列印5遍
	
while:
	
	while(條件判斷){}
	
	[root@localhost ~]# awk -F: '{i=1;while(i<10){print $0, i++}}' /etc/passwd
	
	# 每一行迴圈列印10遍

案例:
	
1、每隔5行,列印一行橫線
 [root@localhost ~]# awk -F: '{if(NR%5==0){print"---------------"}print $0}' /etc/passwd