zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Leetcode Substring with Concatenation of All Words
    Leetcode Divide Two Integers
    Leetcode Edit Distance
    Leetcode Longest Palindromic Substring
    Leetcode Longest Substring Without Repeating Characters
    Leetcode 4Sum
    Leetcode 3Sum Closest
    Leetcode 3Sum
    Leetcode Candy
    Leetcode jump Game II
  • 原文地址:https://www.cnblogs.com/yxh168/p/9042145.html
Copyright © 2011-2022 走看看