007 Linux 命令三劍客之-awk
- 2022 年 1 月 26 日
- 筆記
- linux, Linux 命令工作實踐
01 一起來認識 awk!
Linux 命令三劍客,sed、grep、awk。
- sed:擅長數據修改。
- grep:擅長數據查找定位。
- awk:擅長數據切片,數據格式化,功能最複雜。
awk 更適合格式化文本,對文本進行較複雜格式處理,awk 程式對輸入文件的每一行進行操作。awk 是一門解釋型的程式語言。文本處理、輸出格式化的文本報表、執行算數運算、執行字元串操作等等。
02 awk 完整命令格式
BEGIN { …. initialization awk commands …}{ …. awk commands for each line of the file…}END { …. finalization awk commands …}
- BEGIN{} 語句塊在程式的開頭執行,它只執行一次,在這裡可以初始化變數。BEGIN 是 awk 的關鍵字,因此它必須為大寫,注意,這個語句塊是可選的;
- 主{ }部分,沒有關鍵字,運行處理文件的每一行執行的命令;
- END 語句塊在程式的最後執行,END 是 awk 的關鍵字,因此必須為大寫,它也是可選的。
03 awk 間隔符(分隔符)
- awk 將每一行視為由多個欄位組成,每個欄位由”間隔符”分隔。默認情況下”間隔符” 是一個或多個空格字元,因此行:this is a line of text 包含6個欄位。在 awk 中,第一個欄位稱為 $1,第二個欄位稱為 $2,以此類推,整行稱為 $0。
- awk 內置變數 FS 可以設置間隔符,如設置 FS=”:”,則它將根據’:’作為間隔符。
04 awk 內置變數及可選參數
【內置變數】
- FS # 輸入欄位的分隔符
- NR # 當前行號,已讀的記錄數
- NF # 當前行中的欄位數量
- $NF # NF 當前行中的欄位數量(行參數數量),假如行參數有六個,那麼NF=6,重點來了,如果我要取當前行的最後一個參數,使用 “$6” 和 “$NF” 都能取到最後一個參數,也就是說 $6=$NF=第6個參數值。
【常用可選參數】
- -v # 賦值一個用戶定義變數
- -f # 從腳本文件中讀取 awk 命令
- -F # 相當於內置變數 FS
05 awk 模式匹配
- awk 可以對任何文件進行操作,包括 std-in,在這種情況下,它通常與 ‘|’ 命令一起使用,例如,結合 grep,cat 或其他命令。
- awk 是一種面向行的語言。首先是模式,然後是動作。操作語句用” {} “括起來。
- awk 模式包括正則表達式 (使用與「grep -E」相同的語法) 和使用的組合特殊符號 「&&」 表示「邏輯AND 」,「||」表示「邏輯或」,「!」 的意思是「邏輯不」。
06 awk 控制語句
awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
eg:統計指定ip和埠號,各種 tcp 連接狀態的數量
netstat -n | grep 1.2.3.4:22 | awk '/^tcp/ {++State[$NF]} END {for (i in State) print i, State[i]}'
- 命令中,^tcp用於匹配開頭包含tcp字元的文本行;
- $NF 指的是每行最後一個欄位,數組State[$NF]就是以最後一個欄位為下標指向一個存儲單元或者說變數,此處代表該欄位的統計結果, 也就是++的意義所在, 統計值自增一。
- END不能缺少表示END符號之後的指令於處理所有行結束時執行。
- i是欄位,State[i]即為統計結果,每行處理完成則State[$NF] 加1。
07 awk 常用實踐
- 統計文本行數
awk 'END {print NR}' warn.log #統計 warn.log 文件行數。
- 指定以 , 為分隔符;輸出為 hello world。
文本內容如下:
hello,world,awk,!
awk -F, '{print $1,$2}' info.log # -F, 指定以逗號分隔。
- 實現計算表達式
awk 'BEGIN{print 115+100}'
08 小結
awk 命令,擅長文本格式化處理,這裡只是起到一個拋磚引玉的作用,awk 語法較為複雜,感興趣的可以深入學習,當然你也可以用 python 等語言來做一些腳本任務的處理。
「不甩鍋的碼農」原創,轉載請註明來源,未經授權禁止商業用途!同名 GZH 請關注!