三劍客"老大"awk,教程超級詳細,看完就能get!
目錄
Linux 三劍客之awk
簡介
應用場景
awk執行流程圖
awk生命周期
awk内置(預定義)變量
行與列描述
取行
取列
awk中的函數
條件的分類
awk正則詳細:
普通正則和awk正則差別
範圍表達式
邏輯表達式
算術表達式
特殊模式BEGIN{}和END{}
awk數組
awk 的 判斷、循環
if循環
循環
總體練習
易錯點:
awk主要是用來格式化文本,也有人稱awk是一種語言,類似 C,awk 是三劍客的老大,利劍出鞘,必會不同凡響。
過濾,統計,計算,統計日志
awk讀取檔案之前執行BEGIN,注意BEGIN讀取檔案之前就可以執行,後面不跟檔案,也可以執行
awk讀取檔案時,執行BODY塊
awk讀取檔案後,執行END塊
格式:<code>awk [參數] 'BEGIN{讀取檔案前執行的内容}條件{讀取檔案執行的動作}END{讀取完檔案執行的内容}' [檔案路徑]</code>
完整流程示例(無條件要求示範): 讀取檔案前可以加條件,條件包括正則判斷等,繼續往下看,看完就明白了~
grep、sed和awk都是讀一行處理一行,直至處理完成
内置變量符号
功能描述
$0
代表目前行
$n
代表第n列
NF
記錄目前行的字段數(目前行的列數),$NF表示最後一列
NR
用來記錄行号(相當于計數器)
FS
指定文本内容字段分隔符(預設是空格)
RS
文本分割符 預設為換行符
OFS
指定列印字段分隔符(預設空格)
ORS
輸出的記錄分隔符 預設為換行符
名稱
描述
說明
行
記錄record
每一行結尾預設通過回車分隔
列
記錄字段/域field
列與列預設以空格分隔,可以指定分隔符
awk取行字元
NR==1
取出第1行
NR>=1&&NR<=5
取出1到5行 ---範圍取
//,//
正則取,誰開頭到誰結尾
符号
> < >= <= == !=
<code>-F</code>:指定分隔符,指定每一列結束标記(預設是空格,連續的空格Tab鍵),-F後也支援正則(案例4)
<code>-v</code>:修改變量
$數字:表示取出某一列
<code>$0</code>:表示整行的内容
補充知識:<code>column -t</code>格式化輸出,美化操作
<code>awk '{print $0}' a.sh</code> 輸出的内容和<code>cat</code>的效果一樣
案例1:取出/etc/passwd檔案中的第一列和最後一列
案例2:美化操作
案例3:将/etc/passwd檔案的最後一列和第一列互換位置
案例4:取行和取列實作了文本内容“指哪打哪”,取行又取列
取行和取列主要用到的是比較,大于小于等于···
print函數:列印
printf函數:格式化列印
函數搭配字元
搭配字元
功能
%s
代表字元串
%d
代表數字
-
左對齊
+
右對齊
n
占用字元 eg:15代表占用15個字元長度
運算符參考表
awk中的條件有如下的操作👇
<code>//</code>内寫正則
awk正則可以精确到某一行,某一列中包含什麼内容,或這行不包含什麼内容
<code>~</code>:包含
<code>!~</code>:不包含
正則
awk正則
示例
<code>^</code> 代表以什麼開頭的行
某一列的開頭
<code>$3~/^hammer/</code>:第三列以hammer開頭的行
<code>$</code> 代表以什麼結尾的行
某一列的結尾
<code>$3~/hammer$/</code>:第三列以hammer結尾的行
^$ 代表空行
某一列是空的
<code>/哪裡開始/哪裡結束/</code> -- 字元取範圍,也是正則,經常用
<code>NR==1,NR==5</code>:數字表示範圍,第一行開始到第五行結束,類似<code>sed -n '1,5p'</code>
<code>&&</code>:邏輯與
<code>||</code>:邏輯或
<code>|</code>:邏輯非
<code>+</code>:加
<code>-</code>:減
<code>*</code>:乘
<code>/</code>:除
<code>%</code>:取模
模式
含義
BEGIN
awk讀檔案之前執行
1、進行統計,變量初始化,不涉及讀取檔案等
2、處理檔案之前添加表頭
3、用來定義awk變量(不常用)
END
awk讀檔案之後執行
1、用來接收前面的結果,統計輸出結果(常用)
2、awk使用數組,用來接收和輸出數組的結果(常用)
END{}用于統計計算
統計方法如下
統計方法
簡寫
示例描述
i=i+1
i++
計數,統計次數
1-100一共幾個數
sum = sum+數值
sum+=數值
求和,累加
前100n項和
注意,i和sum都是變量随便寫
可以把END前{}了解為<code>循環</code>
主要應用場景如下👇
統計日志:主要應用為統計日志,類似于統計每個ip出現次數,統計每種狀态碼出現的次數·····
累加求和,統計
形式
使用
格式:arry[]
arry[0]=hammer arry[1]=ze
print arry[0] arry[1]
批量輸出數組内容
for(i in arry)
print i (i是數組下标)
print arry[i] (這樣是列印數組内容)
檔案用數組統計
arry[$列号]++
for (i in arry)
print i,arry[i]
arry[]++,統計什麼就寫到[]内,如果統計出現次數,arry[i]代表次數,i代表内容
差別shell數組
shell數組
echo ${arry[0] $arry[1]}
格式:
單分支:if(條件){執行指令}
雙分支:if(條件){執行指令}else{}
多分支: if(){}else if(){}else{}
for循環和while循環
for循環格式:<code>for(i="初始值";條件判斷;遊标){}</code>
while格式:<code>while(條件判斷){}</code>
内置變量示例如下:
字段分隔符要指定,單個字元的時候有時候可以不指定,比如冒号;
{}外單引号内要用雙引号;
<code>-F</code>如果不指定分隔符建議不要寫
<code>FS</code>指定分隔符建議不要寫<code>-F</code>,防止沖突
三劍客中是對行操作,不要混淆
數組指派字母要用引号,不然會被認為是變量,數字沒事