• shell编程awk基础介绍


    awk介绍

             报告生成器,格式化文本输出

             处理机制类似sed命令,自带循环处理    读入一行处理一行然后自动读取下一行再进行处理

             sed命令换行的标识是固定的,只能是回车换行.    awk里面的换行符是可以自定义的.

             awk自动把读入的行按照指定的切割符号切割成若干个字段   默认的切割符号是空白符号(包括连续的空白符号,tab键,回车换行符)

            

      基础语法

         awk  [options]   'program'  var=value    file

         awk  [options]  -f programfile  var=value   file

         awk [options]   'BEGIN{action;..} pattern{ action;....} END {action;....}'   file

        通常由:  BEGIN语句块    能够使用模式匹配的通用语句块     END语句块    三部分组成

          第一步:  先执行 BGEIN 语句块  经常用于打印表头

          第二步:  从文件或者标准输入读取一行,然后执行pattern语句 它会逐行扫描文件,直到文件全部读取完毕

          第三步: 处理完文件或者输入流的最后一行后,最后执行的语句块  经常用于进行数据汇总

          pattern语句如果没有提供 默认执行 {print } 就是打印每一个读取到的行

     选项 options   

          -F   指明输入时用到的字段分隔符号

          -v   var=value  自定义变量

    awk内置变量

        FS        表示把行按照这个变量进行切割成列
       OFS      表示按这个字符把列进行拼装组合输出
       RS        表示按照这个变量作为行的分隔符
       ORS      表示以这个符号连接每行输出的结果
       NF         表示字段的数量大小
       NR         表示行号
       FNR       多个文件的时候各自的文件行号
       FILENAME       表示当前的文件名称

       FS:输入字段分隔符,默认为空白字符 

         awk -v FS=':'  '{print $1,FS,$3}’ /etc/passwd 

         awk  –F:   '{print $1,$3,$7}’ /etc/passwd 

      OFS:输出字段分隔符,默认为空白字符 

          awk  -v FS=‘:’  -v OFS=‘:’ '{print $1,$3,$7}’ /etc/passwd 

       RS:输入记录分隔符,指定输入时的换行符     默认是换行符

         awk -v RS=' ' ‘{print }’ /etc/passwd 

      ORS:输出记录分隔符,输出时用指定符号代替换行符    默认是换行符

         awk -v RS=' ' -v ORS='###'‘{print }’ /etc/passwd 

      NF:字段数量 

         awk  -F: ‘{print NF}’ /etc/fstab

         awk  -F:  '{print NF,"----"$NF"----"$(NF-1)}'       /etc/passwd    

      引用内置变量不用$   

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

      NR:记录号     

         awk '{print NR}'  /etc/fstab ; awk END'{print NR}'  /etc/fstab

      FNR:各文件分别计数自己的记录号 

         awk '{print FNR}'  /etc/fstab /etc/inittab

      FILENAME:当前文件名 

         awk '{print FILENAME}’  /etc/fstab

      ARGC:命令行参数的个数 

           awk '{print ARGC}’  /etc/fstab /etc/inittab 

           awk ‘BEGIN {print ARGC}’  /etc/fstab /etc/inittab

      ARGV:数组,保存的是命令行所给定的各参数 

         awk ‘BEGIN {print ARGV[0]}’  /etc/fstab /etc/inittab         ARGV[0]代表的awk自己本身  ARGV[1] 代表/etc/fstab  ARGV[2]代表/etc/inittab

         awk ‘BEGIN {print ARGV[1]}’  /etc/fstab /etc/inittab

    awk自定义变量

       自定义变量(区分字符大小写) 

        (1) -v var=value   

        (2) 在program中直接定义 

        (3) 变量最好先定义赋值然后再去使用

    printf格式化输出

          1.输出信息默认不会换行,需要显示指定换行控制符

          格式符:

              1. %c            显示字符的ASCII码

              2. %d,%i       显示十进制数字

              3.  %s           显示字符串

              4.  %%         显示%自身

              5. %f            显示浮点数

           awk -F: '{printf "%s:%s ",$1,$3}'     /etc/passwd

           awk -F: 'BEGIN{print "username      uid"}{printf"%s   %s ", $1,$3}'    /etc/passwd

    awk实例

     1 从文件中读取program
     2 cat awkscript  
     3   {print script,$1,$2} 
     4 [root@centos7 ~]# awk -F: -f awkscript script="awkkk" /etc/passwd
     5 awkkk root x
     6 awkkk bin x
     7 awkkk daemon x
     8 [root@centos7 ~]# awk -F: '{printf"Username: %s
    ",$1}' /etc/passwd
     9 Username: root
    10 Username: bin
    11 Username: daemon
    12 输出json字典
    13 [root@centos7 ~]# awk -F: '{printf "Username:%s,UID:%d
    ",$1,$3}' /etc/passwd
    14 Username:root,UID:0
    15 Username:bin,UID:1
    16 [root@centos7 ~]# awk -F: '$0 ~ /root/{print $1}' /etc/passwd
    17 root
    18 operator
    19 rooter
    20 [root@centos7 ~]# awk -F: '$0 ~ /^root/{print $1}' /etc/passwd
    21 root
    22 rooter
    23 awk '$0 !~ /root/' /etc/passwd
    24 bin:x:1:1:bin:/bin:/sbin/nologin
    25 daemon:x:2:2:daemon:/sbin:/sbin/nologin
    26 [root@centos7 ~]# awk -F: '$3==0' /etc/passwd
    27 root:x:0:0:root:/root:/bin/bash
    View Code
     1 [root@centos7 ~]# awk '{print 2^10}'
     2 e
     3 1024
     4 [root@centos7 ~]# awk -F: '{print $1":"$3}' /etc/passwd
     5 root:0
     6 bin:1
     7 daemon:2
     8 [root@centos7 ~]# df | awk '{print $1,$3}'
     9 Filesystem Used
    10 /dev/sda2 4347496
    11 devtmpfs 0
    12 tmpfs 0
    13 [root@centos7 ~]# awk -v FS=: '{print $1,$3}' /etc/passwd
    14 root 0
    15 [root@centos7 ~]# awk -v FS=: '{print $1FS$3}' /etc/passwd
    16 root:0
    17 shell变量传递给awk
    18 [root@centos7 ~]# fs=":";awk -v FS=$fs '{print $1FS$3}' /etc/passwd
    19 root:0
    20 bin:1
    21 
    22 [root@centos7 ~]# awk -v ORS="****" '{print $1}' a2
    23 1****3****o****2****o****4****You have new mail in /var/spool/mail/root
    24 [root@centos7 ~]# awk '{print $1}' a2
    25 1
    26 3
    27 o
    28 2
    29 o
    30 4
    View Code
     1 [root@centos7 ~]# df | grep '^/dev/sd'|awk '{print $1,$5}'
     2 /dev/sda2 9%
     3 /dev/sda3 1%
     4 /dev/sda1 20%
     5 [root@centos7 ~]# df | grep '^/dev/sd'|awk -v FS=% '{print $1}'
     6 /dev/sda2       52403200 4347456  48055744   9
     7 /dev/sda3       31441920   83004  31358916   1
     8 /dev/sda1        1038336  198256    840080  20
     9 [root@centos7 ~]# df | grep '^/dev/sd'|awk -v FS=% '{print $1}'|awk '{print $1,$5}'
    10 /dev/sda2 9
    11 /dev/sda3 1
    12 /dev/sda1 20
    13 [root@centos7 ~]# awk -F: '{print NF,$NF,$(NF-1)}' /etc/passwd
    14 7 /bin/bash /root
    15 7 /sbin/nologin /bin
    16 7 /sbin/nologin /sbin
    17 7 /sbin/nologin /var/adm
    18 7 /sbin/nologin /var/spool/lpd
    View Code
  • 相关阅读:
    html实现 省——市——区三级联动
    test
    JAVA课程设计——坦克大战
    Java MOOC-互评作业-流与文件
    DS博客作业06--图
    DS博客作业08--课程总结
    DS博客作业07--查找
    DS博客作业06--图
    DS博客作业05-树
    DS博客作业01--日期抽象数据类型设计与实现
  • 原文地址:https://www.cnblogs.com/yxh168/p/9042145.html
Copyright © 2020-2023  润新知