awk 小結

wKioL1XlqTbgXxXpAACNkbOZ8S8184.jpg

awk

是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤爲強大。簡單來說awk就是把文件逐行的讀入,以空格爲默認分隔符將每行切片,切開的部分再進行各種分析處理。

參數:
-F fs               指定行中分隔數據字段分隔符
-f file             指定讀取程序的文件名
-v var=value        定義awk程序中的一個變量及其默認值
-mf N               指定要處理的數據文件中的最大字段數
-mr N               指定數據文件中的最大數據行數
-W keyword          指定awk的兼容模式或警告等級

例子:
# cat awk.txt
data11,data12,data13,data14,data15
data21,data22,data23,data24,data25
data31,data32,data33,data34,data35

指定分隔符,打印第一行
# awk -F'[,]' '{print $1}' awk.txt
data11
data21
data31
取出網卡的IP地址,指定兩個分隔符
# ifconfig eth0|awk NR==2|awk -F'[: ]+' '{print $4}'
192.168.1.2
# ifconfig eth0 |awk -F '[ :]+' 'NR==2 {print $4}'
192.168.1.2

使用變量:
1、字段和數據行分隔符變量
$1、$2、$3:分別表示第一行、第二行、第三行
$NF             最後一列
$(NF-1)         倒數第二列
NF              數據文件中的字段總數
NR              已處理的輸入數據行數目,行號

FIELDWIDTHS     由空格分隔開的定義了每個數據字段確切寬度的一列數字
FS              輸入字段分隔符
RS              輸入數據行分隔符
OFS             輸出字段分隔符
ORS             輸出數據行分隔符

例子:
# cat awk.txt
data11,data12,data13,data14,data15
data21,data22,data23,data24,data25
data31,data32,data33,data34,data35
1.指定分隔符號,打印出前三列
# awk 'BEGIN{FS=","} {print $1,$2,$3}' awk.txt
data11 data12 data13
data21 data22 data23
data31 data32 data33
2.替換指定分隔符,打印前三列
# awk 'BEGIN{FS=",";OFS="-"} {print $1,$2,$3}' awk.txt
data11-data12-data13
data21-data22-data23
data31-data32-data33
3.FIELDWIDTHS變量允許讀取數據行,而不用字段分隔符來劃分字段。在一些應用程序中,不用字段符,數據是被放置在數據行的某些列中。在這種情況下,你必須設定FIELDWIDTHS變量來匹配數據在數據行中的位置。這裏是根據提供的字段寬度大小來計算字段。
# cat awksum.txt
1005.3247596.37
115-2.349194.00
05810.1298100.1

# awk 'BEGIN{FIELDWIDTHS="3 5 2 5"}{print $1,$2,$3,$4}' awksum.txt
100 5.324 75 96.37
115 -2.34 91 94.00
058 10.12 98 100.1
# awk 'BEGIN{FIELDWIDTHS="3 5 3 9"}{print $1,$2,$3,$4}' awksum.txt
100 5.324 759 6.37
115 -2.34 919 4.00
058 10.12 981 00.1
# awk 'BEGIN{FIELDWIDTHS="4 5 3 9"}{print $1,$2,$3,$4}' awksum.txt
1005 .3247 596 .37
115- 2.349 194 .00
0581 0.129 810 0.1

顯示/etc/passwd文件中有多少行
# awk '{print NR}' /etc/passwd

awk使用案例:
統計同一個IP的訪問量,以下是文件
# cat access.log
10.0.0.41 - - [03/Dec/2010:23:27:01 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.43 - - [03/Dec/2010:23:27:01 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.42 - - [03/Dec/2010:23:27:01 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.46 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.42 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.47 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.41 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.47 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.41 - - [03/Dec/2010:23:27:03 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.46 - - [03/Dec/2010:23:27:03 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
以下這是效果
# awk '{print $1}' access.log |sort|uniq -c|sort -nr -k1
      3 10.0.0.41
      2 10.0.0.47
      2 10.0.0.46
      2 10.0.0.42
      1 10.0.0.43

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章