AWK由浅入深

1.  AWK的讲解

    它适合文本处理和报表生成。

    awk --version

    linux上awk是gawk

    

2.  awk的格式

    awk是由模式,动作组合而成。

    awk [option]  'pattern{action}'  file

    option:参数选项

    pattern:条件

    action:执行的动作

3.  awk的执行过程

    1.  awk读入第一行内容

    2.  判断是否符合pattern中的条件

        1.  如果匹配就执行动作

        2.  否则读取下一行

    3.  继续读下一行

    4.  重复2---3,直到结尾。

 

4.  awk的变量

    1.  awk内置变量之记录变量

        FS:  读取文本时,使用的字段分隔符

            例子:

            awk 'BEGIN{FS=":"}{print $1}' /etc/passwd

            awk -F ':' '{print $1}' /etc/passwd

            这两个结果是一样的          

        RS:  读取文本信息使用的换行符

            例子:  把某一行内容,读取出来,再换行显示出来    

1.txt

a|b|c

代码:awk 'BEGIN{ RS="|"; } { print $0 }'

a

b

c   

        OFS:  输出字段分隔符

            例子:  打印出1,2,3,4列,以逗号作为分隔符

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

root,x,0,0
bin,x,1,1
daemon,x,2,2
adm,x,3,4
lp,x,4,7

        ORS:  输出时的行分隔符

            ORS是RS的逆向运行,也就是把多行内容转换成一行

            例子:

            awk  'BEGIN{ORS="-"}{print $0}' /etc/passwd | head -10

            root:x:0:0:root:/root:/bin/bash-bin:x:1:1:bin:/bin:/sbin/nologin-daemon:x:2:2:daemon:/sbin:/sbin/nologin-adm:x:3:4:adm:/var/adm:/sbin/nologin-lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin-sync:x:5:0:sync:/sbin:/bin/sync-shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown-halt:x:7:0:halt:/sbin:/sbin/halt-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin-uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin-operator:x:11:0:operator:/

    2.  awk内置变量之数据变量

        NR:  文本行号

        例子:

          awk '{print NR}' /etc/passwd  当前文件的每一行的行号        

        NF:  字段总数

        例子:

          awk -F ':' '{print NF}' /etc/passwd  每一行的字段数

          awk -F ':' '{print $NF}' /etc/passwd  每一行的最后一个字段 

        FNR:  FNR与NR的区别在于,分析多个文件时,NR以所有文件作为参考记录行号,而FNR以行所在文件记录行号。

        例子:

[sysadmin@192 ~]$ awk '{print FNR}' /etc/shells /etc/passwd
1
2
3
4
5
6
1
2
3
4
5
6
7
8
9
10

    3.  awk自定义变量

        变量名命名只能使用字母数字下划线,且不能以数字开头,gawk变量名称区分大小写。

        1.  在脚本中赋值变量

            awk 'BEGIN{test="hello";print test}'

        2.  在命令行中赋值变量

            awk -v test="hello" 'BEGIN{print test}'    

5.  awk的操作符

    1.  算术操作符

        -x:  负值

        +x:  转换为数值

        x**y:  次方

        x/y:  除法

        x*y:  乘法

        x+y:  加法

        x-y:  减法

        x%y:  取余

    2.  比较操作符

        x < y

        x <= y

        x > y

        x >= y

        x == y

        x ~ y

        x !~ y

    3.  赋值操作符

        =

        +=

        -=

        *=

        /=

        ++

        --

    4.  逻辑关系符

        &&

        ||

    5.  条件表达式

        selector?if-true-exp:if-fales-exp

        例子:

        a=3

        b=4

        a>b?a is max:b is max

6.  awk常见的模式类型

    1.  正则表达式

        awk -F: '/^r/{print $0}' /etc/passwd

    2.  表达式

        awk 'NR==5{print $0}' /etc/passwd  取出第5行

        awk -F ':' '$4==500{print $0}' /etc/passwd  取出第4列等于500的那一行

        awk -F ':' '$7=="/sbin/nologin" && $4==522{print $0}' /etc/passwd  取出第7列等于/sbin/nologin并且第4列等于522的那一行

        awk -F ':' '$4+1>500{print $0}' /etc/passwd  取出第4列加1后大于500的行

        awk -F: '$7 ~ "bash$"{print $0}' /etc/passwd  取出第7列以bash结尾的行

    3.  ranges模式

    4.  BEGIN END模式  仅在awk命令执行前运行一次或结束前运行一次

        例子:

        awk -F: 'BEGIN{print "username   a   id  "}{print $1,$2,$3}END{print "OK!"}' /etc/passwd

username   a   id  
root x 0
bin x 1
daemon x 2
adm x 3
lp x 4
sync x 5
shutdown x 6
halt x 7
mail x 8
OK!  

    5.  Empty模式  打印出所有行

        例子:

        awk '{print $1}' /etc/passwd

7.  awk常见的action

    1.  if   else

        语法: if (condition) {then-body}

        例子:

        awk -F: '{if ($1=="root") print $1,"admin";else print $1,"common user"}' /etc/passwd

root admin
bin common user
daemon common user
adm common user
lp common user
sync common user       

        awk -F: -v sum=0 '{if ($3>=500) sum++}END{print sum}' /etc/passwd

        6

    2.  while  循环字段

    3.  do while

    4.  for

    5.  case

8.   awk实战例子

    1.  以某一个字段的数值排序

        grep "QTime=" /var/solr/logs/solr.log | awk -F "QTime=" '{print $1,$2}' | sort -k17 -rn | grep -v "path=/update" > /tmp/solrslow.txt

    2.  查询某个时间段的日志

        awk '  $2>"10:00"  && $2<"11:00" ' catalina.out  查看10点到11点之间的日志信息

 

 

    

      

   

    

    

    

       

            

        

 

 

 

  

 

  

         

           

         

      

   

posted @ 2018-02-07 10:55  奋斗史  阅读(136)  评论(0)    收藏  举报