1 第2.1節:AWK腳本結構
1.1 第1個awk腳本
??假設有如下的數據待處理,需要將第2列提取出來:
#, 名稱, 大小, 類型, 修改, 屬性
1, COMMIT_EDITMSG, 331 bytes, 文件, 24/09/16 08:42:19, -a-----
2, config, 130 bytes, 文件, 24/09/14 11:52:27, -a-----
3, description, 73 bytes, 文件, 24/09/14 11:52:27, -a-----
4, HEAD, 23 bytes, 文件, 24/09/14 11:52:27, -a-----
5, index, 145 bytes, 文件, 24/09/16 08:42:19, -a-----
6, tgitchangelist, 0 bytes, 文件, 24/09/16 08:42:21, -a-----
1.1.1 命令行方式
awk示例:
awk '{print $2}' data.txt
注:awk
命令后的單引號內容表示awk語句。
輸出:
名稱,
COMMIT_EDITMSG,
config,
description,
HEAD,
index,
tgitchangelist,
1.1.2 腳本方式
??將下面的代碼復制到文件get_col_2.awk
#!/bin/awk -f
{print $2
}
注意:第1行注釋很重要,-f
表示該腳本可以接收文件
執行命令get_col_2.awk data.txt
輸出:
$ ./get_col_2.awk data.txt
名稱,
COMMIT_EDITMSG,
config,
description,
HEAD,
index,
tgitchangelist,
- 發現什么沒有? 不論是命令方式,還是腳本文件方式,awk代碼都用
{}
包圍。
1.2 模式 - 動作(Pattern - Action)
??在 AWK 腳本中,模式 - 動作
是核心結構。模式用于篩選輸入數據中的特定行,動作則定義了對這些篩選出來的行要執行的操作。
示例代碼:
#!/bin/awk -f
$1 % 2 == 0 {print $1,$2
}$1 % 3 == 0 {print $1,$2
}
??上述示例代碼中有兩個模式和動作,
- 第1個模式:第1列的數字整除2,即
$1 % 2 == 0
,則執行后面{print $1,$2}
中的動作,這里是打印第1、2列。 - 第2個模式:第1列的數字整除3,即
$1 % 3 == 0
,則執行后面的{print $1,$2}
中的動作,這里是打印1、2列,當然,可以做別的事。
輸出:
$ ./get_col_2.awk data.txt
#, 名稱,
#, 名稱,
2, config,
3, description,
4, HEAD,
6, tgitchangelist,
6, tgitchangelist,
注:由于有多個模式-動作
塊,所以會發現有些數據打印了多次!
??awk的處理邏輯是讀取每1行文本,將這行文本丟到每個模式-動作進行處理,如果匹配了模式,則執行該模式對應的動作。
??模式可以是關系表達式(如$1 > 100
篩選出第一列數據大于 100 的行)、正則表達式(如/error/
篩選出包含 “error” 字符串的行)等。動作部分則能包含各種 AWK 語句,像變量賦值、數學運算、調用函數等。通過靈活組合模式與動作,實現對數據的精準處理。
1.3 BEGIN 和 END 塊
BEGIN 塊在 AWK 讀取輸入數據之前執行,常用于初始化變量、設置環境等操作。例如,在對系統及進程的 CPU、內存進行自動監控分析時,可能需要初始化一些統計變量,記錄總的 CPU 使用時長、內存使用峰值等,就可以在 BEGIN 塊中完成:
BEGIN {  totalCpuTime = 0  maxMemoryUsage = 0}
END 塊在所有輸入數據處理完畢后執行,通常用于輸出最終結果、清理資源等。繼續上面的例子,在分析完所有數據后,我們想輸出總的 CPU 使用時長和內存使用峰值的統計結果,就可在 END 塊中實現:
END {  print "Total CPU Time:", totalCpuTime  print "Max Memory Usage:", maxMemoryUsage}
通過 BEGIN 和 END 塊,能讓 AWK 腳本在數據處理的前后階段完成一些準備和收尾工作,與中間的模式 - 動作結構協同,構建出完整、高效的數據處理流程,這也是 AWK 在數據處理領域強大功能的體現。
1.4 總結:
??一個完整的awk
腳本包含以下幾部分
- 注釋:該注釋是有意義的,可以告訴腳本引擎該腳本的執行方式
- BEGIN塊:在1行數據都沒有處理的時候,進行一些初始化設置,也可以定義一些函數
- 模式-動作塊:數據處理代碼,可以有多個
模式-動作塊
,對同一行數據進行多次處理 - END塊:數據全部處理結束后執行的語句
作者聲明:本文用于記錄和分享作者的學習心得,可能有部分文字或示例來自AI平臺,如:豆包、DeepSeek(硅基流動)(注冊鏈接)等,由于本人水平有限,難免存在表達錯誤,歡迎留言交流和指教!
Copyright ? 2022~2025 All rights reserved.