天天看點

Linux 三劍客之awk

Linux 三劍客之awk

三劍客"老大"awk,教程超級詳細,看完就能get!

目錄

Linux 三劍客之awk

簡介

應用場景

awk執行流程圖

awk生命周期

awk内置(預定義)變量

行與列描述

取行

取列

awk中的函數

條件的分類

awk正則詳細:

普通正則和awk正則差別

範圍表達式

邏輯表達式

算術表達式

特殊模式BEGIN{}和END{}

awk數組

awk 的 判斷、循環

if循環

循環

總體練習

易錯點:

Linux 三劍客之awk
awk主要是用來格式化文本,也有人稱awk是一種語言,類似 C,awk 是三劍客的老大,利劍出鞘,必會不同凡響。

過濾,統計,計算,統計日志

awk讀取檔案之前執行BEGIN,注意BEGIN讀取檔案之前就可以執行,後面不跟檔案,也可以執行

awk讀取檔案時,執行BODY塊

awk讀取檔案後,執行END塊

格式:<code>awk [參數] 'BEGIN{讀取檔案前執行的内容}條件{讀取檔案執行的動作}END{讀取完檔案執行的内容}' [檔案路徑]</code>

Linux 三劍客之awk
完整流程示例(無條件要求示範): 讀取檔案前可以加條件,條件包括正則判斷等,繼續往下看,看完就明白了~
Linux 三劍客之awk
grep、sed和awk都是讀一行處理一行,直至處理完成

内置變量符号

功能描述

$0

代表目前行

$n

代表第n列

NF

記錄目前行的字段數(目前行的列數),$NF表示最後一列

NR

用來記錄行号(相當于計數器)

FS

指定文本内容字段分隔符(預設是空格)

RS

文本分割符 預設為換行符

OFS

指定列印字段分隔符(預設空格)

ORS

輸出的記錄分隔符 預設為換行符

名稱

描述

說明

記錄record

每一行結尾預設通過回車分隔

記錄字段/域field

列與列預設以空格分隔,可以指定分隔符

awk取行字元

NR==1

取出第1行

NR&gt;=1&amp;&amp;NR&lt;=5

取出1到5行 ---範圍取

//,//

正則取,誰開頭到誰結尾

符号

&gt; &lt; &gt;= &lt;= == !=

<code>-F</code>:指定分隔符,指定每一列結束标記(預設是空格,連續的空格Tab鍵),-F後也支援正則(案例4)

<code>-v</code>:修改變量

$數字:表示取出某一列

<code>$0</code>:表示整行的内容

補充知識:<code>column -t</code>格式化輸出,美化操作

Linux 三劍客之awk
<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個字元長度

運算符參考表
Linux 三劍客之awk
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>&amp;&amp;</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>,防止沖突

三劍客中是對行操作,不要混淆

數組指派字母要用引号,不然會被認為是變量,數字沒事

Linux 三劍客之awk