awk命令

  • awk是一種處理文本的語言,是一個強大的文本分析工具。
  • 之因此叫AWK是由於其取了三位創始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。

語法

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的工做原理

awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
  • 第一步:執行BEGIN{ commands }語句塊中的語句。
  • 第二步:從文件或標準輸入(stdin)讀取一行,而後執行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


awk 內置變量(預約義變量)

說明:[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}'

將外部變量值傳遞給awk

  • 藉助-v選項,能夠將外部值傳遞給awk:
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語句塊以後。


awk運算與判斷


awk 高級輸入輸出

  • awk中next語句使用:在循環逐行匹配,若是遇到next,就會跳過當前行,直接忽略下面語句。而進行下一行匹配。net語句通常用於多行合併:
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
相關文章
相關標籤/搜索