1. 程式人生 > 其它 >linux中awk命令詳解(最全面秒懂)

linux中awk命令詳解(最全面秒懂)

一:linux中awk命令

1.awk命令簡介
AWK 是一種處理文字檔案的語言,是一個強大的文字分析工具。
之所以叫 AWK 是因為其取了三位創始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字元
linux中有三劍客之稱:
三劍客之首就是 AWK
三劍客功能:
grep : 過濾文字
sed  :  修改文字
awk  :  處理文字
2.awk作用
awk主要是用來格式化
3.awk的語法格式
	awk [引數] [處理內容] [操作物件]

4.解析awk使用方法
print	: 列印
NF		: 統計總欄位數
$		: 取值
結合作用:
	$配合NF使用 : NF記憶體儲統計檔案內每行的總欄位,$儲存NF內的值
	NF	:相當於 變數值	$	:相當於 變數名
	print相當於列印 $ 內的內容
5.引數
	-F : 指定文字分隔符 (本身預設是以空格作為分隔符)

實戰案例:
awd -F'f' '{print $NF}' 1.txt

解析:
-F'f' : 指定f為分隔符

6.awk的生命週期
grep,sed和awk都是讀一行處理一行,直到處理完成。
  1. 接收一行作為輸入
  2. 把剛剛讀入進來得到文字進行分解
  3. 使用處理規則處理文字
  4. 輸入一行,賦值給$0,直至處理完成
  5. 把處理完成之後的所有資料交給END{}來再次處理

二:awk中的預定義變數

$0	: 代表當前行(相當於匹配所有)
	awk -F: '{print $0, "---"}' /etc/passwd

$n : 代表第n列
案例1:(以:為分隔符)
awk -F: '{print $1}' /etc/passwd
案例2:(預設空格為分隔符)
awk '{print $1}' /etc/passwd

NF : 記錄當前統計總欄位數
案例1:(以:為分隔符 統計檔案內每行內的行數)
awk -F: '{print NF}' /etc/passwd
案例2:(以:為分隔符 統計檔案內每行總欄位 並列印每行統計行數)
awk -F: '{print $NF}' /etc/passwd

NR : 用來記錄行號
案例1:
awk -F: '{print NR}' /etc/passwd

FS : 指定文字內容分隔符(預設是空格)
案例1:
awk 'BEGIN{FS=":"}{print $NF, $1}' /etc/passwd
解析:
BEGIN{FS=":"} : 相當於指定以 : 為分隔符
$NF : 儲存以 : 分隔符的最後一列
$1 : 儲存以 : 分隔符的第一列
print : 列印

OFS : 指定列印分隔符(預設空格)
案例1:(輸出的意思 分隔符會打印出來)
awk -F: 'BEGIN{OFS=" >>> "}{print $NF, $1}' /etc/passwd
FS 的優先順序要高於 -F
解析:
BEGIN{OFS=" >>> "} : 指定列印分隔符
$NF : 儲存以 >>> 分隔符的最後一列
$1 : 儲存以 >>> 分隔符的第一列
print : 列印

三:awk執行處理規則的執行流程

1. BEGIN{}	: 最開始執行
2. //		: 正則
3. {}		: 迴圈體
4. END{}	: 最後執行

這裡面最少有一個,最多有四個!

四:awk中的函式

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

awk中函式(格式化列印)
案例1:
awk -F: 'BEGIN{OFS=" | "}{printf "|%+15s|%-15s|\n", $NF, $1}' /etc/passwd

解析:
| : 以 | 為分隔符
|%+15s| : 以 | 為分隔符 %s 配合 printf 使用 代替當前字串 右對齊 佔用15字元
|%-15s| : 以 | 為分隔符 %s 配合 printf 使用 代替當前字串 左對齊 佔用15字元
\n : 換行符
$NF : 儲存以 | 為分隔符的最後一列
$1 : 儲存以 | 為分隔符的第一列

五:awk中的定位

1.正則表示式
案例1:(awk中匹配有root內容的行)
	awk -F: '/root/{print $0}' /etc/passwd
解析:
	/root/{print $0}	: awk中先執行正則 在執行迴圈 匹配檔案內有root的每一行。
	       $0			:代表所有
案例2:(awk中匹配root開頭的行)
	awk -F '/^root/{print $0}' /etc/passwd

六:比較表示式(匹配文字之內的內容)

	>		: 小於
	<		: 大於
	>=		: 小於等於
	<=		: 大於等於
	~		: 正則匹配(包含)
	!~		: 正則匹配(不包含)

案例1:
要求列印屬組ID大於屬主ID的行
awk -F: '$4 > $3{print $0}' /etc/passwd
解析:
$4 : 代表屬組所在列
$3 : 代表屬主所在列
$0 : 所有行

案例2:
列印結尾包含bash
awk -F: '$NF ~ /bash/{print $0}' /etc/passwd
解析:
$NF ~ /bash/ :尾部最後一列 包含 bash 的行
~ : 包含

a案例3:
列印結尾不包含bash
awk -F '$NF !~ /bash/{print $0}' /etc/passwd
解析:
!~ : 不包含 (將列印其他內容)

七:條件表示式(文字之外的內容)

==		
	>
	<
	>=
	<=

要求列印第三行
案例1:
awk -F: 'NR == 3{print $0} /etc/passwd'
解析:
NR : 行號
NR == 3 : 行號等於3

注意:
$1 : 是列
NR == 3 : 是行

八:邏輯表示式

	&&		: 邏輯與
	||		: 邏輯或
	!       : 邏輯非

案例1:(與(兩者條件必須都成立))
awk -F: '$3 + $4 > 2000 && $3 * $4 > 2000{print $0}' /etc/passwd

案例2:(或(兩者條件一個成立即可))
awk -F: '$3 + $4 > 2000 || $3 * $4 > 2000{print $0}' /etc/passwd

案例3:(非(條件取反))
awk -F: '!($3 + $4 > 2000){print $0}' /etc/passwd

九:算數表示式

	+	:加
	-	:減
	*	:乘
	/	:除
	%	:求餘

1.要求匹配打印出屬組 + 屬主的ID 大於 2000 的
案例1:
awk -F: '$3 + $4 > 2000{print $0}' /etc/passwd

2.要求屬組 * 屬主的ID 大於 2000
案例2:
awk -F: '$3 * $4 > 2000{print $0}' /etc/passwd

3.要求列印偶數行
案例3:
awk -F: 'NR % 2 == 0{print $0}' /etc/passwd
解析:
NR :全部行號 除以 2 == 零的 零等於餘數

偶數 : 2 4 6...

4.要求列印奇數行
案例4:
awk -F: 'NR % 2 == 1{print $0}' /etc/passwd

NR  :全部行號 除以 2 == 1的 零等於奇數

奇數: 1 3 5...

十:流程控制

簡介:
	流程控制只存在迴圈之中

if:
awk -F: '{if($3>$4){print "大於"}else{print "小於或等於"}}' /etc/passwd
解析:
判斷檔案 第三列大於第四列的話列印(大於) 不大於 else

if 使用格式:
if(){} : 但分支
if(){}else{} : 雙分支
if(){}else if(){}else{} : 多分支

for每一行列印10次
for 使用格式
awk -F: '{for(i=10;i>0;i--){print $0}}' /etc/passwd
解析:
i-- 相當於python中的 i-=1 : i=i-1
減到條件不成立為止
格式:
fro(i="初始值":條件判斷:遊標){}

while每一行列印10次
while 使用格式
awk -F: '{i=1; while(i<10){print $0, i++}}' /etc/passwd
解析:
i++ 相當於python中的 i+=1
加到條件不成立為止
格式:
while(條件判斷){}

十一:實戰案例(if判斷列印隔五一行線)

1.使用if判斷
每隔5行,列印一行橫線
awk -F: '{if(NR%5==0){print "----------"}print $0}' /etc/passwd
解析:
	1. NR	: 每一行的行號
	2. 行號 除以 5 ==0
	3. 列印一行
	以此類推 4%5=0.8

點選檢視原文章