AWK向来以它的便捷著称,过滤内容一步到位。

    awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。

   awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。

   如果没有指定处理动作,则把匹配的行显示到标准输出 (屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。




记录与字段

$0awk变量$0保存当前记录的内容                            # awk -F: '{print $0}' /etc/passwd

NR:每条记录的记录号,每处理完一条记录,NR值加1            # awk -F: '{print NR, $0}'/etc/passwd

NF:保存记录的字段数,$1,$2...$100                    #awk -F: '{print $0,NF}' /etc/passwd

FS:输入字段分隔符,默认空格                            #awk -F: '/alice/{print $1, $3}' /etc/passwd

                                                #awk -F'[ :\t]' '{print $1,$2,$3}' /etc/passwd                                                                                       //使用多个字段分隔符

OFS:输出字段分隔符                      #awk -F: '/alice/{print $1,$2,$3,$4}' /etc/passwd

                              #awk -F: 'BEGIN{OFS="+++"} /^root/{print $1,$2,$3,$4}' /etc/passwd




awk工作原理

# awk -F: '{print $1,$3}' /etc/passwd    //以“:”为分隔符,显示一三列

(1)awk使用一行作为输入,并将这一行赋给内部变量$0,每一行也可称为一个记录,以换行符结束

(2)然后,行被空格分解成字段(或域),每个字段存储在已编号的变量中,从$1开始,最多达100个字段

(3)awk如何知道空格是用来分隔字段的呢?因为有一个内部变量FS来确定字段的分隔符。初始时,FS被赋为空格

(4)awk打印字段时,将以设置的方法使用print函数打印

 awk在打印的字段间加上空格,因为$1,$3之间有一个逗号。逗号比较特殊,它映射为另一个内部变量,称为输出字段分隔符OFSOFS默认为空格

逗号被OFS变量中存储的字符替换

(5)awk输出之后,将从文件中获取另一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分隔成字段并进行处理。该过程将持续到所有行处理完毕






例子2:

   awk -F: '{max=($3 > $4) ? $3: $4;print max}' /etc/passwd    

   如果第3个字段的值大于第4个字段的值,则把问号后那个表达式的值赋给max,否则就将冒号后那个表达式的值赋给max;

   awk '!($2 < 100 && $3 <20)' filename          

   如果两个条件为真,awk将否定该表达式并取消对该行的打印;


分支语句

if/elseelse if语句

   awk -F: '{if($3==0){i++} elseif($3>499){k++} else{j++}} END{print "管理员个数: "i; print "普通用个数: "k; print "系统用户: "j}' /etc/passwd

管理员个数: 1              

普通用个数: 34

系统用户: 36


循环

while

awk -F: '{i=1; while(i<=10) {print$0;  i++}}' /etc/passwd       //将每行打印10


for

awk -F: '{for(i=1;i<=10;i++) print $0}'/etc/passwd    //将每行打印10


数组:

# awk -F: '{username[x++]=$1}END{for(i=0;i<NR;i++) print i,username[i]}' /etc/passwd

0 root

1 bin

2 daemon

3 adm

4 lp



统计某列出现的次数

例如:统计网址出现次数,并排序

[root@www www]# cat bai

http://blog.163.com/awk_sed/blog/static/

http://nginxs.blog.51cto.com/

http://my.zhaopin.com/myzhaopin/resume_index.asp

http://blog.163.com/awk_sed/blog/static/

http://blog.163.com/awk_sed/blog/static/

http://nginxs.blog.51cto.com/

http://blog.163.com/awk_sed/blog/static/

http://nginxs.blog.51cto.com/


#awk -F/ '{a[$3]++}END{for(i in a)print a[i],i}'bai|sort –r

4 blog.163.com

3 nginxs.blog.51cto.com

1 my.zhaopin.com

首先”-F/”就是以“/”为分隔符。