awk [選項參數] 'script' var=value file(s) 或 awk [選項參數] -f scriptfile var=value file(s)
-F fs or --field-separator fs
指定輸入文件折分隔符,fs是一個字符串或者是一個正則表達式,如-F:。正則表達式
-v var=value or --asign var=value
賦值一個用戶定義的變量。
---數組
awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
BEGIN語句塊在awk開始從輸入流中讀取行以前被執行,這是一個可選的語句塊,好比變量初始化、打印輸出表格的表頭等語句一般能夠寫在BEGIN語句塊中。函數
END語句塊在awk從輸入流中讀取完全部的行以後即被執行,好比打印全部行的分析結果這類信息彙總都是在END語句塊中完成,它也是一個可選語句塊。
pattern語句塊中的通用命令是最重要的部分,它也是可選的。若是沒有提供pattern語句塊,則默認執行{ print },即打印每個讀取到的行,awk讀取的每一行都會執行該語句塊。工具
echo -e "A line 1\nA line 2" | awk 'BEGIN{ print "Start" } { print } END{ print "End" }'
當使用不帶參數的print時,它就打印當前行,當print的參數是以逗號進行分隔時,打印時則以空格做爲定界符。在awk的print語句塊中雙引號是被看成拼接符使用,例如:命令行
echo | awk '{ var1="v1";var2="v2";var3="v3";print var1,var2,var3;}' v1 v2 v3
雙引號拼接使用:code
echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"="var2"="var3; }' v1=v2=v3
{ }相似於一個循環體,會對文件中的每一行進行迭代,一般變量初始化語句(如:i=0)以及打印文件頭部的語句放入BEGIN語句塊中,將打印的結果等語句放入END語句塊中。ip
說明:[A][N][P][G]表示第一個支持變量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk字符串
$n 當前記錄的第n個字段,好比n爲1表示第一個字段,n爲2表示第二個字段。table
$0 這個變量包含執行過程當中當前行的文本內容。class
支持工具 | 變量名 | 描述 |
---|---|---|
[A] | FILENAME | 當前輸入的文件名 |
[A] | FS | 字段分隔符 |
[A] | NF | 字段數,在執行過程當中對應於當前的字段數 |
[A] | NR | 記錄數,執行過程當中對應於當前的行號 |
[A] | OFMT | 數字的輸出格式 |
[A] | OFS | 輸出字段的分隔符 |
[A] | ORS | 輸出記錄的分隔符 |
[A] | RS | 記錄分隔符 |
[N] | ARGC | 命令行參數的數目 |
[N] | ARGV | 包含命令行參數的數組 |
[N] | ERRNO | 最後一個系統錯誤的描述 |
[N] | RSTART | 由match函數所匹配的字符串的第一個位置 |
[N] | RLENGTH | 由match函數所匹配的字符串的長度 |
[N] | SUBSEP | 數組小標分隔符(默認值是34) |
[G] | ARGIND | 命令行中當前文本的位置(從0開始計算) |
[G] | CONVFMT | 數字轉換格式 |
[G] | FIELDWIDTHS | 字段寬度列表 |
[G] | IGNORECASE | 若是爲真,則進行忽略大小寫的匹配 |
[P] | ENVIRON | 環境變量關聯數組 |
[P] | FNR | 同NR,但相對於當前文件 |
awk 'END{print NR}' filename
awk '{ print $2,$3}' filename
echo -e "line1 f2 f3 \n line2 f4 f5" | awk '{print $(NF-1)}'
seq 5 | awk 'BEGIN{ sum=0;print "總和:" } { print $1"+"; sum+=$1 } END{ print "等於"; print sum}'
VAR=10000 echo | awk -v variable=$VAR '{ print variable }'
var1="aaa" var2="bbb" echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2
awk '{ print v1,v2 }' v1=$var1 v2=$var2 filename
以上方法中,變臉之間用空格分隔做爲awk命令行的參數數據跟隨在BEGIN、{ }和END語句塊以後。
cat test.txt a b c d e f awk 'NR%2==1{next}{print NR,$0;}' text.txt 2 b 4 d
cat tmp.log |awk '{print $15}'|awk -F'=' '{print $5}'
cat tmp.log |awk '{print $15}'|awk -F'=' '{print $5}' | sort | uniq -c