awk 是一個強大的文字分析工具,它是 Linux 中功能強大的數據處理引擎之一,可能這麼說非常抽象,awk 可以非常輕鬆地處理比如每行都是相同格式的文字,比如日誌,cvs 格式等等。相對於 grep 的查詢,sed 的編輯,awk 在其對數據分析並生成報告時,顯得尤爲強大。本文,只是簡單介紹如何使用awk完成簡單的日常任務需求。
# 統配模式
awk [options] 'script' file
options
這個表示一些可選的參數
選項,script
表示 awk 的可執行指令碼程式碼
(一般被{}
花括號包圍),這個是必須的。file
這個表示 awk 需要處理的檔案,注意需要是純文字檔案
(意味着 awk 能夠處理)。
# 傳統模式
awk [options] 'BEGIN{statement} {statement} END{statement}' file
BEGIN: 在指令碼程式碼段前面使用 BEGIN 關鍵字時,它會在開始讀取一個檔案之前,執行一次 BEGIN 關鍵字後面的指令碼程式碼段, BEGIN 中的指令碼程式碼段只會執行一次,執行完之後 awk 程式就會退出。
END: awk 的 END 指令和 BEGIN 恰好相反,在 awk 讀取並且處理完檔案的所有內容行之後,纔會執行 END 後面的指令碼程式碼段。
$0
表示當前行中的數據。\$1,$2,$3...
表示當前行中的第一列,第二列數據,第三列數據…賦值: =
算術:+ - * / %
比較:< <= == != > >= ~ !~ 。~ 表示正則
。
邏輯:&& || !
在使用 awk 讀取檔案或者檔案,或者文字的時候,我們需要在遍歷每一列,並將符合要求的列中的數據進行輸出。那麼我們就需要使用到 for 語句與 if 語句。具體語句用法同 shell 有區別。
#{}中用分號分隔多個動作
for(i=1;i<=NF;i++){action1; action2; ..}
#for後接一個if結構
for(i=1;i<=NF;i++) if; else if;else
#簡單的回圈列印
for(i=1;i<=NF;i++) printf "for add"
#else if部分可以沒有
if($1 ~ /reg/){action1}; else if($1 ~ /reg2/){action2}; else{action3}
#多個條件用」&&」,」||」表示
if($1 ~ /reg/ && $2 ~ /reg2/){action}
if($1 ~ /reg/ || NR >= 5){action}
開始小案例的演示工作之前,我們需要準備份文字數據,方便指令要操作完成小案例。樣例數據(sample_data.txt):
this is sample data
i love shell program
2020 8 14 16 29
apple banana mango orange
so happy today
有了樣本數據,那麼我們就可以開始操作了,由於篇幅有限,只做個別演示。
awk '{print NR "\t" $0}' sample_data.txt
awk '{print NR "\t" $1 " " $2 " "$4}' sample_data.txt
awk ' NR == 3 {$2='0'$2; print $1 "-" $2 "-"$4}' sample_data.txt
awk 'BEGIN{res="";} {if(NR == 2){res=$1" "$2;}else if(NR == 4){res=res" eat "$1;}} END{print res;}' sample_data.txt
編碼實踐是最有效,最高效的學習技能!
希望我們可以一起學習,一起編碼,一起成長進步!