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