一.基本介紹
1.awk:
awk是一個強大的文本分析工具,在對文本文件的處理以及生成報表,awk是無可替代的。awk認爲文本文件都是結構化的,它將每一個輸入行定義爲一個記錄,行中的每個字符串定義爲一個域(段),域和域之間使用分割符分割。
2.功能:流控制、數學運算、進程控制、內置的變量和函數、循環和判斷
3.工作原理:
awk 會把每行進行一個拆分,用相應的命令對拆分出來的“段”進行處理。
(1)行工作模式,讀入文件的每一行,會把一行的內容,存到$0裏
(2)使用內置的變量FS(段的分隔符,默認用的是空白字符),分割這一行,把分割出來的每個段存到相應的變量$(1-100)
(3)輸出的時候按照內置變量OFS(out FS),輸出
(4)讀入下一行繼續操作
簡單實例
1 [root@tx3 ~]# echo "this is a book" > awk.txt 2 [root@tx3 ~]# awk '{print $2,$1,$3,$4}' awk.txt is this a book
4. Awk常用內置變量表:
1 $0 當前記錄(作爲單個變量)
2 $1~$n 當前記錄的第n個字段,字段間由FS分隔
3 FS 輸入字段分隔符 默認是空格 (可記憶爲:FieldsSpace縮寫)
4 NF 當前記錄中的字段個數,就是有多少列 (可記憶爲:NumberFields縮寫)
5 NR 已經讀出的記錄數,就是行號,從1開始 (可記憶爲:NumberRows縮寫)
6 RS 輸入的記錄他隔符默 認爲換行符 (可記憶爲:RowsSpace縮寫)
7 OFS 輸出字段分隔符 默認也是空格 (可記憶爲:OutputFieldsSpace縮寫)
8 ORS 輸出的記錄分隔符,默認爲換行符 (可記憶爲:OutputRowsSpace縮寫)
9 ARGC 命令行參數個數
10 ARGV 命令行參數數組
11 FILENAME 當前輸入文件的名字
12 IGNORECASE 如果爲真,則進行忽略大小寫的匹配
13 ARGIND 當前被處理文件的ARGV標誌符
14 CONVFMT 數字轉換格式 %.6g
15 ENVIRON UNIX環境變量
16 ERRNO UNIX系統錯誤消息
17 FIELDWIDTHS 輸入字段寬度的空白分隔字符串
18 FNR 當前記錄數
19 OFMT 數字的輸出格式 %.6g
20 RSTART 被匹配函數匹配的字符串首
21 RLENGTH 被匹配函數匹配的字符串長度
二.print的簡單使用
例:打印整行: $0
1 [root@tx3 ~]# cp /etc/passwd p1 2 [root@tx3 ~]# awk '{print $0}' p1
例:打印每行的最後一個字段: $NF
1 [root@tx3 ~]# awk -F : '{print $NF}' p1
例:打印第三個字段: $3
[root@tx3 ~]# awk -F : '{print $3}' p1
例:打印第一行NR==1
1 [root@tx3 ~]# awk 'NR==1{print $0}' p1 root:x:0:0:root:/root:/bin/bash
例:打印最後一行
1 [root@tx3 ~]# awk 'END{print $0}' p1 tx:x:500:500:tx:/home/tx:/bin/bash
例:打印第一行最後一個字段
1 [root@tx3 ~]# awk -F: 'NR==1{print $NF}' p1 /bin/bash
例:打印最後一行最後一個字段
1 [root@tx3 ~]#awk -F: 'END{print $NF}' p1
例:打印每行的倒數第二個字段,並在其後打印你好
1 [root@tx3 ~]# awk -F: '{print $(NF-1),"nihao"}' p1 /root nihao /bin nihao /sbin nihao
例:打印行號
1 [root@tx3 ~]# awk '{print NR,$0}' p1 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
例:打印當前系統環境變量的某個特定值
1 [root@tx3 ~]# awk 'BEGIN{print ENVIRON["PATH"];}' /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
例: 用:分割,刪除第2個字段
1 [root@tx3 ~]# awk 'BEGIN{FS=":";OFS=":"}{print $1,$3,$4,$5,$6,$7}' p1 root:0:0:root:/root:/bin/bash bin:1:1:bin:/bin:/sbin/nologin daemon:2:2:daemon:/sbin:/sbin/nologin
BEGIN和END:(打印報表實例)
在Unix awk中兩個特別的表達式,BEGIN和END,這兩者都可用於pattern中(參考前面的awk語法),提供BEGIN和END的作用是給程序賦予初始狀態和在程序結束之後執行一些掃尾的工作。
任何在BEGIN之後列出的操作(在{}內)將在Unix awk開始掃描輸入之前執行,而END之後列出的操作將在掃描完全部的輸入之後執行。因此,通常使用BEGIN來顯示變量和預置(初始化)變量,使用END來輸出最終結果。
例:累計銷售文件xs中的銷售金額(假設銷售金額在記錄的第三字段):
1 [root@tx3 ~]#awk 'BEGIN{FS=":";print "統計銷售金額";total=0}{print $3;total=total+$3;}END{printf "銷售金額總計:%.2f",total}' sx
在這裏,BEGIN預置了內部變量FS(字段分隔符)和自定義變量total,同時在掃描之前顯示出輸出行頭。而END則在掃描完成後打印出總合計