linux三劍客之awk 文字分析工具
阿新 • • 發佈:2021-12-22
目錄
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