[ awk簡介: ]
awk可以從一個文本中擷取部分內容, 或者對這個文本進行排版, 使它按某種格式輸出.
[ awk工作流程: ]
awk會把檔案一行內容去到記憶體裡, 然後對這行內容進行分段 ( 預設按空格或tab分割, $1, $2, $3... ). 再刪了, 然後讀取第二行內容到記憶體...格式: awk '{/pattern/ command1; command2; ...}' file # 匹配模式的這一行執行命令例如: who | awk '{print $1}' # 把分段的第一塊內容列印出來, $1為第一段, $0為一行所有內容
[ awk參數說明: ]
-F re:允許awk更改其欄位分隔符號。-v 定義變數, 從shell給awk傳遞變數, 如-vDATE=$DATE, 即將shell中$DATE變數值傳遞給awk變數DATE。
-f progfile:允許awk調用並執行progfile程式檔案,當然progfile必須是一個符合awk文法的程式檔案。
[ awk內建變數: ]
ARGC 命令列參數的個數
ARGV 命令列參數數組
ARGIND 當前被處理檔案的ARGV標誌符 awk '{if(ARGIND==1){print $1} if(ARGIND==2){print $2}}' aaa.txt bbb.txt # 先掃描aaa檔案, 再掃描bbb檔案
NR 已經讀出的記錄數 awk 'NR==1,NR==5{print}' aaa.txt # 顯示aaa.txt檔案的 1 到 5 行
FNR 當前檔案的記錄數 awk 'NR==FNR{print "a"} NR > FNR{print "b"}' a.txt b.txt # 輸入檔案a.txt和b.txt, 由於先掃描a.txt, 所以掃描a.txt的時候必然有NR==FNR; # 然後掃描b.txt的時候, FNR從1開始計數, 而NR則接著a.txt的行數繼續計數, 所以NR > FNR
FS 輸入欄位分隔符號(預設為:space:),相當於-F選項 awk -F ':' '{print $1}' ccc.txt # 輸入檔案以 : 作為分割符
OFS 輸出欄位分隔符號(預設為:space:) # 輸出時以 ; 分割 ① cat ccc.txt 如下:
1:2:3
4:5:6 ② awk -F ':' 'BEGIN{OFS=";"}{print $1,$2,$3}' ccc.txt
③ 輸出結果如下:
1;2;3
4;5;6
NF 目前記錄中的分段個數 awk -F ':' '{print NF}' ccc.txt
RS 輸入記錄分隔字元, 預設為"\n", 預設情況下, awk把一行看作一個記錄; 如果設定了RS, 那麼awk按照RS來分割記錄 ① cat ccc.txt: hello world; I want to go swimming tomorrow;hiahia
② 運行 awk 'BEGIN{ RS = ";" } {print}' ccc.txt
③ 結果如下: hello world
I want to go swimming tomorrow
hiahia
ORS 輸出記錄分隔字元,預設為分行符號,控制每個print語句後的輸出符號
awk 'BEGIN{ FS="\n"; RS=""; ORS=";"} {print NF}' ddd.txt
[ awk內建函數: ]
blength[([s])] 計算字串長度(byte為單位)
length[([s])] 計算字串長度(character為單位)
rand() 產生隨機數
srand([expr]) 設定rand() seed
int(x) 字串轉換為整型
substr(s, m [, n]) 取子字串
index(s, t) 在字串s中定位t字串首次出現的位置
match(s, ere) 在字串s中匹配正則ere,match修改RSTART、RLENGTH變數。
split(s, a[, fs]) 將字串分割到數組中
sub(ere, repl [, in]) 字串替換
gsub 同上
sprintf(fmt, expr, ...) 拼字串
system(cmd) 在shell中執行cmd。
toupper(s) 字串轉換為大寫
tolower(s) 字串轉換為小寫
[ awk用法樣本: ]
1. -F 表示以什麼作為分隔字元 awk -F: '{print $1}' ccc.txt # 以 : 作為分隔字元, 列印出ccc.txt檔案中每一行中的第一段字串 awk -F: '{print $1,$2}' ccc.txt # 列印第一段和第二段字串, 如果這樣寫$1 $2 那麼列印的內容會連在一起
2. /pattern/ 模式比對 awk -F: '/A/{print $1}' ccc.txt # 以 : 作為分隔字元, 列印出ccc.txt檔案中含有 A 的第一段字串
3. ^ 表示以什麼開頭 awk -F: '/^A/{print $1}' ccc.txt # 以 : 作為分隔字元, 列印出ccc.txt檔案中以 A 開頭的第一段字串
4. ~ 表示匹配的意思 awk -F: '$4 ~ /A/{print $1}' ccc.txt # 以 : 作為分隔字元, 列印出ccc.txt檔案中第四段中含有 A 的字串
5. awk在把第一行讀入記憶體之前, 可以先做其他的一些操作, 使用BEGIN 格式: awk 'BEGIN{command} /pattern/ {command1; command2; ...}' file
awk 'BEGIN{FS=":"}$1 ~ /A/{print $1}' ccc.txt # 讀取ccc.txt檔案之前, 首先執行BEGIN裡的命令, 設定 : 作為分割符 awk 'BEGIN{FS=":"; OFS="-"}$1 ~ /A/{print $1,$2}' ccc.txt # 輸出的分隔字元以 - 進行隔開
6. awk在所有行處理完之後, 還可以先一些操作, 使用END 格式: awk 'BEGIN{command} /pattern/ {command1; command2; ...} END{command}' file
7. 統計每一行分段後的段數用NF who | awk '{print NF}'
8. 擷取awk處理檔案內容在源檔案中是第幾行用NR awk -F: '/^A/{print NR}' ccc.txt # 擷取以 A 開頭的串在ccc.txt是第幾行
9. 自訂變數 awk 'BEGIN{a=0}/tb/{a++} END{print a}' ccc.txt # 迴圈ccc.txt檔案之前, 先定義一個變數, 初始值為0; 然後迴圈每一行, 每找到一行含有tb的行就給 a 加 1, 直到最後列印 a 的值.