Linux 文本处理三剑客之“awk”

1、awk的工做原理和使用格式node

基本语法:mysql

       awk [option]... '/pattern/{action}' FILE

awk 的执行流程以下所述:linux

一、首先awk根据“行标记”读取行(awk处理的单位是行)sql

   awk根据行标志读入一行(linux系统中默认的行结束标志是:"\n")编程

二、而后,按要求作匹配bash

   awk会检查读取到行与指定的“pattern”作匹配,编程语言

   (1)、若是读取到的行与指定的"pattern"不匹配,awk又读取下一行。ide

   (2)、若是读取到的行与指定的“pattern”匹配,awk就使用指定的段分隔符(默认为空格,可使spa

         用“-F”定义)对行进行切片,而后执行action。3d

awk的模式PATTERN有:

   (1)、使用地址范围:

        start_line,end_line       从哪行开始到那行结束,指定处理范围的行
        #                         指定处理那行
        /part1/,/part2/           匹配其中一个
        /parttern/                只匹配该模式的

     如:

    [root@www ~]# free | awk '/^Mem/{printf "%s:\t%0.1f%\n","FreeMen",($4+$6+$7)/$2*100}'
     FreeMen:        64.6%

   (2)、表达式:指的是比较表达式     

       >、>=、==、<、<=、!=、~(模式匹配)

      如:

       awk -F: '$3 >= 500{print $0}' /etc/passwd
       awk -F: '$7 ~ /bash$/{print $0}' /etc/passwd

    使用表达式作awk处理的行匹配时,还可使用:&& 或 ||

      如:

       [root@www ~]# awk  -F: '$3 < 500 && $3 > 400 {print $0}'  /etc/passwd
       rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
       saslauth:x:498:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
       pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
       mysql:x:496:493::/home/mysql:/bin/bash

三、最后输出:action 

   (1)、有只打印"print"不格式化。

   (2)、格式化“printf”以后输出。

   说明:

        awk 是一种编程语言,awk对行进行切片以后,可使用awk的算术运行与字符比较,判断语

    句,对字段进行逻辑操做以后,再经过print与printf(print format)输出。


2、【awk】是如何实现报告生成的呢?

使用printf 动做,进行数据的格式化操做.

printf的语法:

           printf "format(格式)", item1(字段),item2,...
要点:
   (1)、要指定format
   (2)、不会自动换行:如需换行则须要给出换行符:"\n"
   (3)、format用于为后面的每一个item指定其输出格式
        是以字符串格式输出仍是以浮点数格式输出或以十进制格式输出呢

format格式的指示符都以“%”开头,后跟一个字符

   
   %c:         显示字符的ASCII码
   %d, %i      十进制整数int
   %e, %E      科学计数法显示数值
   %f          显示浮点数float
   %g, %G      以科学计数法格式或浮点数格式显示数值
   %s          显示字符串string
   %u          显示无符号整数
   %%          显示%自身

format格式的修饰符:

    #          显示宽度
    -          左对齐
    +          右对齐
    .#         取值精度

例:

    数据的格式化报告的生成方法:

一、第一步:使用printf动做支持的fromat格式,格式化数据。

    计算内存的剩余百分比。

   [root@stu13 ~]# free | awk '/^Mem/{printf "%f\n",($4+$6+$7)/$2}'
   0.816848

二、第二步:使用format格式的修饰符,美化数据的输出。

   [root@stu13 ~]# free | awk '/^Mem/{printf "%0.1f%\n",($4+$6+$7)/$2*100}'
   81.7%

说明:

    若是,咱们对文本中的特定行的段,数据进行计算处理的话。使用【awk】是最好的。

先匹配(使用地址范围)到须要处理的行,awk会根据指定的分隔符对匹配到的行进行切割。这时候咱们就可使用awk内置的算术运算对这些片断作数学运算了。且awk的格式化报告功能很强大。



例:

  格式化输出:/etc/passwd文件中,用户的ID号大于10且小于200的用户和用户ID号。

分析:

    因为【awk】命令的默认字段分隔符是:空格。因此要自定义字段分隔符。--------> awk切割字段的标准

    因为对用户的ID号有要求,因此awk命令不是对每一行都进行切割,要作行匹配----->awk处理的行标准

    要使用到awk的action中的printf完成数据的格式化操做。

format的选择:

        字段     选择format

         $1      字符型格式输出:s%
         $3      数值类型且十进制制格式输出:d%

以下:

    [root@node1 ~]# awk -F: '$3<200 && $3>10{printf "%s%d\n",$1,$3}' /etc/passwd
    operator11
    games12
    gopher13
    ftp14
    nobody99
    dbus81
    usbmuxd113
    vcsa69
    rpc32
    avahi-autoipd170

说明:没有指定字段分隔符,printf格式化的字符是连起来的。


使用linux系统中制表符"\t"作为字段的分隔符。

    [root@node1 ~]# awk -F: '$3<200 && $3>10{printf "%s\t%d\n",$1,$3}' /etc/passwd
    operator        11
    games   12
    gopher  13
    ftp     14
    nobody  99
    dbus    81
    usbmuxd 113
    vcsa    69
    rpc     32
    avahi-autoipd   170
    haldaemon       68

说明:

    从上面显示能够看出,字段与字符之间是分开了。 可是因为每一个字段的长度不一样因此。它们还不能对齐。

   因此,以最长的字段为准,指定字段的显示宽度。使用format的格式修饰符指定显示宽度。

   [root@node1 ~]# awk -F: '$3<200 && $3>10{printf "%-13s\t%-13d\n",$1,$3}' /etc/passwd
   operator        11
   games           12
   gopher          13
   ftp             14
   nobody          99
   dbus            81
   usbmuxd         113
   vcsa            69
   rpc             32
   avahi-autoipd   170
   haldaemon       68
   ntp             38
a  pache           48

说明:以字段:avahi-autoipd 为标准,它有13个字符。因此,格式化时指定每一个字段占用13. ------> 显示宽度。“-”表示字段以左对齐的方式。


扩展:

    显示/etc/passwd第4字段,第4字段是用户的组ID号,因此选择format格式的指示符为:%d, 显示宽度为:13 且是左对齐。

    [root@node1 ~]# awk -F: '$3<200 && $3>10{printf "%-13s\t%-13d\t%-13d\n",$1,$3,$4}' /etc/passwd
    operator        11              0
    games           12              100
    gopher          13              30
    ftp             14              50
    nobody          99              99
    dbus            81              81
    usbmuxd         113             113
    vcsa            69              69
    rpc             32              32
    avahi-autoipd   170             170
    haldaemon       68              68

使用【BEGIN】模式增长标题:标明显示的各个字段是什么

    [root@node1 ~]# awk -F: 'BEGIN{printf "%-13s\t%-13s\t%-13s\n","UserName","User_PID","UserGroup_ID"}$3<200 && $3>10{printf "%-13s\t%-13d\t%-13d\n",$1,$3,$4}' /etc/passwd
    UserName        User_PID        UserGroup_ID
    operator        11              0
    games           12              100
    gopher          13              30
    ftp             14              50
    nobody          99              99
    dbus            81              81
    usbmuxd         113             113
    vcsa            69              69
    rpc             32              32
    avahi-autoipd   170             170

这样:报告显示清晰明了。

相关文章
相关标签/搜索