• awk 应用


    awk应用

    一、awk格式和选项

    awk [options] 'script' var=value file(s) 
    awk [options] "PATTRN  {'aciton'}" file(s) 

    常用命令选项

    -F fs   fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:

    -v var=value   赋值一个用户定义变量,将外部变量传递给awk

    -f scripfile  从脚本文件中读取awk命令

    -m[fr] val   对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。

    二、awk的模式(PATTERN)

      awk 'program' input-file1 input-file2

       其中program为:

         pattern{action}

         pattern{action}

    (一)常见的模式类型

       1、正则表达式:格式为/regular expression/

           2、表达式:其值非0或非空字符串时满足条件,如:$1 ~/foo/ ,用运算符~(匹配)和~!(不匹配)

           3、范围:指定匹配范围,格式:awk -F '/^r/,/^m/{print $1,$2}' /etc/passwd 以r开头到m开头截止

           4、BEGIN/END:特殊模式,仅在awk命令前运行一次或结束前运行一次

           5、空模式:匹配任何数行

    (二)常见的action

         1、表达式,判断表达式等

         2、控制语句(if,for等)

         3、复合语句:重定向到其他文件

         4、输入输出语句

    三、awk的输出

     (一)print输出

     格式:print item1,item2 ,...

    要点:

          1、各项目之间用逗号隔开,而输出时则以空白字符分隔;

          2、输出的item可以是字符串或数值、当前记录的字段(如$1)、变量或awk的表达式;数值会转换为字符串再输出;

          3、print命令后面的item可以省略,此时相当于 print $0;如果想输出空白行,则需使用print "";

    例子:

       #awk 'BEGIN{print "how are you"}'

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

    分析:print中的$0表示自己,$1表示awk切分的片为第1片,$2为第2片。

    (二) awk变量

      2.1、awk内置变量之记录变量

      FS:读取文档时,所使用的字段分隔符,默认为空白字符。

      OFS:打印输出时,所使用的字段分隔符,默认为空白字符。

      RS:输入文本信息时所使用的换行符,默认是" "

      ORS:打印输出时所使用的换行符,默认是" "

    例子:

             awk 'BEGIN(OFS=" ")'{print $1 ,$2} /etc/passwd

      2.2、awk内置变量之数据的变量

           NR:命令所处理的记录数:如果有多个文件,这个数目会把处理的多个文件中行统一计数;

           FNR:与NR不同的是,FNR用于记录正处理的行,是当前这一文件中总共处理的行数;

           NF:当前记录的字段个数 

           ARGV:数组,保存命令本身这个字符串;

              如:awk '{print $0}' a.txt b.txt 这个命令中,ARGV[0]保存awk,ASGV[1]保存a.txt

           ARGC: awk命令的参数个数

           FILENAME: awk命令所处理的文件名称

           ENVIRCN:当前shell环境变量及值的关联数组

              如:awk 'ENGIN{print ENVIRCN["PATH"]}'

    2.3、用户自定义变量

    awk允许用户自定义自己的变量在程序代码中使用,变量名规则是只能使用字母、数字和下滑线,数字不能开头。区分大小写。

    2.3.1   在脚本中赋值变量

    在awk中给变量赋值:

    例:

    awk 'BEGIN{var ="good";print var}'

    2.3.2 在命令行中使用赋值变量

    awk可以在"脚本"外为变量赋值,并在脚本中引用。例如:上述可改为:

    awk -v var="good" 'BEGIN{print var}'

    四、printf格式输出

    printf命令使用格式:

    printf format ,item1,item2,..

    要点:

       1、printf 需要指定format(格式);

       2、format用于指定后面每个item的输出格式;

       3、printf语句不会自动打印换行符:

    format格式指示符(以%开头后跟一个字符):

      %c:显示字符

      %s:显示字符串

      %d,%i:十进制数

       %e,%E:科学计数法

       %f:浮点数

       %g,%G:以科学计数法的格式或浮点格式显示数值

     %u:无符号整数

       %%:显示自身

    修饰符:

        N:显示宽度

        -:左对齐,默认是右对齐

        +:显示数值符号

    例子:

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

    五、输出重定向

     print items > output-file

     print items > output-file

     print items | command

    特殊文件描述符:

         /dev/stdin: 标准输入

        /dev/stdout:标准输出

        /dev/stderr:错误输出

       /dev/fd/N:某特定文件描述符,如/dev/stdin 就相当于/dev/fd/0

    例子:

    awk -F:'{printf "%15s %i ",$1,$2 >"/dev/sderr"}' /etc/passwd

    六、awk的操作符

    注意:> < 可以作为字符串比较,也可以用作数值比较,关键看操作数如果是字符串就会转换为字符串比较。两个都为数字才转为数值比较。字符串比较:按照ASCII码顺序比较。

    七、数组

       (一)、数组的定义

                array[index-expression]

                     1、数字做数组下标

          Arr[1]="sun" 
          Arr[2]="uu"

                     2、字符串做数组下标

          Array["first"]="www" 
          Array["last"]="name" 
          Array["birth"]="1987"

      index-expression可以是任意字符串,需要注意的是如果某数据组元素事先不存在,那么在其引用时,awk会自动创建次元素并初始化为空字符串,因此要判断某数据组中使用index in array方式

    要遍历数组中每一个元素,需要使用如下结构:

    for (var in arrar) {statement1,...}

    其中 var用于引用数组下标,而不是元素值;

    例子:

         netstat -ant | awk '/^tcp/ {S[$NF]++} END{for (a in S ) print a,S[a]}'

        每出现一次/^tcp/模式匹配到的行,数组S[$NS]就加1,NF为当前行的最后一个字段,此处用其值作为数组S的元素索引;

        awk '{counts[$1]++}END {for(url in counts) print counts[url],url}'  /var/log/httpd/access_log

    (二)删除数组

      delete array[key]

         可以删除,对应数组key的,序列值。

    例:

      awk 'BEGIN{t1["a"]="a",t1["b"]="b"} delete t1["a"] END{for(k in t1) print t1,t1[k]}'

    八、流程控制语句

         每条命令语句后面可以用;分号结尾。

          条件判断语句

    复制代码
    if(表达式) 
    {语句1} 
    else if(表达式) 
    {语句2} 
    else 
    {语句3}
    复制代码

    例子:

    复制代码
    awk 'BEGIN{ test=100; 
    if(test>90)
    { print "very good"; 
    } else if(test>60)
    { print "good"; } else { print "no pass";
    }
    }'
    复制代码

      循环语句

    while语句

    while(表达式) 
    {语句}

    例子:

    复制代码
    awk 'BEGIN{ 
    test=100; 
    total=0; 
    while(i<=test){
     total+=i; i++; 
     } 
     print total; 
     }' 
     5050
    复制代码

    for循环

    for循环有两种格式:

    格式1

    for(变量 in 数组) 
    {语句}

    例1:

    复制代码
    awk 'BEGIN{
    name[1]="aa",
    name[2]="bb"
    }
    END{
     for (k in name){
     print name[k],k 
    }
    }'
    复制代码

    例2

    复制代码
    awk 'BEGIN{ 
    for(k in ENVIRON){
     print k"="ENVIRON[k];
     }
    
     }' 
    
    
    TERM=linux
     G_BROKEN_FILENAMES=1 
    SHLVL=1 pwd=/root/text 
    ... 
    logname=root
     HOME=/root 
    SSH_CLIENT=192.168.1.21 53087 22
    复制代码

    注:ENVIRON是awk常量,是子典型数组。

    格式2:

    for(变量;条件;表达式) 
    {语句}

    例:

    复制代码
    awk 'BEGIN{
     total=0; for(i=0;i<=100;i++){
     total+=i; 
    } print total; 
    }' 
    5050
    复制代码

    do循环

    do {语句} 
    while(条件)

    例:

    复制代码
    awk 'BEGIN{ 
    total=0; i=0; 
    do {total+=i;i++;}
     while(i<=100) 
    print total; 
    }' 
    5050
    复制代码

    其他语句

    break 当 break 语句用于 while 或 for 语句时,导致退出程序循环。

    continue 当 continue 语句用于 while 或 for 语句时,使程序循环移动到下一个迭代。

    next 能能够导致读入下一个输入行,并返回到脚本的顶部。这可以避免对当前输入行执行其他的操作过程。

    exit 语句使主输入循环退出并将控制转移到END,如果END存在的话。如果没有定义END规则,或在END中应用exit语句,则终止脚本的执行。

  • 相关阅读:
    virtual Box在Centos 7上的安装
    Spark MLlib使用有感
    storm集群配置
    eclipse配置hadoop插件
    HDFS的java接口——简化HDFS文件系统操作
    【hbase】——HBase 写优化之 BulkLoad 实现数据快速入库
    【hbase】——Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询
    【转】RHadoop实践系列之二:RHadoop安装与使用
    【转】RHadoop实践系列之一:Hadoop环境搭建
    Hadoop生态系统如何选择搭建
  • 原文地址:https://www.cnblogs.com/2567xl/p/11494319.html
Copyright © 2020-2023  润新知