Linux三劍客之一awk
awk
grep、sed和awk都是讀一行處理一行,直至處理完成
定義
格式化文字
格式
awk [引數][分隔符] '{[處理規則]}' [操作物件]
awk [引數][分隔符] '{BEGIN{開始初需要的處理}/定位/{迴圈}END{結束前需要的處理}}' [操作物件]
引數
-F :指定文字中的分隔符(預設是以空格作為分隔符)
案例:列印系統所有使用者的解析器
awk -F: '{print $NF}' /etc/passwd
生命週期
1.讀取一行作為待處理文字
2.把剛剛讀取進來的文字進行分解
3.再使用處理規則處理待處理文字
4.處理完,賦值給$0
5.把處理完成之後的所有的資料交給END{}來再次處理
預定義變數
$0 :當前行所有資料
awk -F: '{print $0, "---"}' /etc/passwd # 每行後面加上---
,是預設以空格作為分隔符拼接的意思
$n :第n列
awk -F: '{print $1}' /etc/passwd # 第一列
NF :記錄當前行的欄位數(就是分隔符分了多少段數)
awk -F: '{print NF}' /etc/passwd # 每行分了多少段
awk -F: '{print $NF}' /etc/passwd # 只顯示最後一列
NR
awk -F: '{print NR}' /etc/passwd # 給每行遞增編號
FS :指定文字中的分隔符(預設空格)(與-F的作用相似 , 但優先順序比之優先)
定義在BEGIN{FS="指定原文字內分隔符"}中
awk 'BEGIN{FS=":"}{print $NF, $1}' /etc/passwd # 以“:”讀取最後一列和第一列
OFS :指定讀取處理出來的文字中使用的分隔符(預設空格)
定義在BEGIN{FS="指定新文字中分隔符"}中
awk -F: 'BEGIN{OFS=" >>> "}{print $NF, $1}' /etc/passwd # 讀取最後一列和第一列中間使用>>>拼接在一起
處理規則中執行順序
awk [引數][分隔符] '{BEGIN{開始初需要的處理}/定位/{迴圈}END{結束前需要的處理}}' [操作物件]
BEGIN{} :開始前需要的處理
// :定位
{} :迴圈
END{} :結束前需要的處理
中的函式
awk -F: 'BEGIN{OFS=" | "}{printf "|%+15s|%-15s|\n", $NF,$1}' /etc/passwd
print :列印
printf :格式化列印
%s :字串
%d :數字
- :左對齊
+ :右對齊
15 :至少佔用15字元
定位
1.正則表示式
awk -F: '/root/{print $0}' /etc/passwd # 列印含root所在行的所有內容
awk -F: '/^root/{print $0}' /etc/passwd # 列印以root開頭所在行的所有內容
2.比較表示式(文字內部資料比較)
> :大於
< :小於
>= :大於等於
<= :小於等於
~ :表示匹配後面的正則表示式
!~ :表示(取反)後面的正則表示式的結果
案例:
案例1:要求列印屬組ID大於屬主ID的行
awk -F: '$4 > $3{print $0}' /etc/passwd # 匹配打印出第4列比第3列大的行
案例2:結尾包含bash
awk -F: '$NF ~ /bash/{print $0}' /etc/passwd # 讀取最後一列給到後面正則表示式篩選出含bash的行
案例3:結尾不包含bash
awk -F: '$NF !~ /bash/{print $0}' /etc/passwd #讀取最後一列給到後面正則表示式篩選出不含bash的行
3.邏輯表示式
&& :邏輯與
awk -F: '$3 + $4 > 2000 && $3 * $4 > 2000{print $0}' /etc/passwd # 必須同時滿足兩個條件
|| :邏輯或
awk -F: '$3 + $4 > 2000 || $3 * $4 > 2000{print $0}' /etc/passwd # 只要滿足一個條件
! :邏輯非
awk -F: '!($3 + $4 > 2000){print $0}' /etc/passwd # 必須兩個條件同時都不滿足
4.算術表示式
+ :加
- :減
* :乘
/ :除
% :取餘
案例:
案例1:要求屬組 + 屬主的ID 大於 2000
awk -F: '$3 + $4 > 2000{print $0}' /etc/passwd
案例2:要求屬組 * 屬主的ID 大於 2000
awk -F: '$3 * $4 > 2000{print $0}' /etc/passwd
案例3:要求列印偶數行
awk -F: 'NR % 2 == 0{print $0}' /etc/passwd
案例4:要求列印奇數行
awk -F: 'NR % 2 == 1{print $0}' /etc/passwd
5.條件表示式(內部資料與指定資料比較)
== :等於(相同)
> :大於
< :小於
>= :大於等於
<= :小於等於
案例:要求列印第三行
awk -F: 'NR == 3{print $0}' /etc/passwd # 指定 行編號為3的列印
6.範圍表示式
一個選定條件到另一個選定條件之間的資料
eg:
awk -F: '/^root/,/^ftp/{print $0}' /etc/passwd # 以root開頭的行到以ftp開頭的行中間的行
流程控制
只存在迴圈中