精华内容
下载资源
问答
  • awk 应用

    2019-10-01 20:37:31
    awk应用 一、awk格式和选项 awk [options] 'script' var=value file(s) awk [options] "PATTRN {'aciton'}" file(s) 常用命令选项 -F fs fs指定输入分隔符,fs可以是字符串或正则表达式,如-F: -v var=...

    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:输入文本信息时所使用的换行符,默认是"\n"

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

    例子:

             awk 'BEGIN(OFS="\t")'{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语句不会自动打印换行符:\n

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

      %c:显示字符

      %s:显示字符串

      %d,%i:十进制数

       %e,%E:科学计数法

       %f:浮点数

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

     %u:无符号整数

       %%:显示自身

    修饰符:

        N:显示宽度

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

        +:显示数值符号

    例子:

          awk -F: '{printf "%-15s %i\n",$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\n",$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语句,则终止脚本的执行。

    转载于:https://www.cnblogs.com/2567xl/p/11494319.html

    展开全文
  • awk应用

    2016-11-17 11:28:00
    awk应用 一、awk格式和选项 awk [options] 'script' var=value file(s) awk [options] "PATTRN {'aciton'}" file(s) 常用命令选项 -F fs fs指定输入分隔符,fs可以是字符串或正则表达式,如-F: -v var=...

    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:输入文本信息时所使用的换行符,默认是"\n"

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

    例子:

             awk 'BEGIN(OFS="\t")'{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语句不会自动打印换行符:\n

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

      %c:显示字符

      %s:显示字符串

      %d,%i:十进制数

       %e,%E:科学计数法

       %f:浮点数

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

     %u:无符号整数

       %%:显示自身

    修饰符:

        N:显示宽度

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

        +:显示数值符号

    例子:

          awk -F: '{printf "%-15s %i\n",$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\n",$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语句,则终止脚本的执行。

    更多:http://man.linuxde.net/awk#awk命令格式和选项

    转载于:https://www.cnblogs.com/programmer-tlh/p/6071261.html

    展开全文
  • shell中的awk应用

    2021-01-10 13:12:08
    awk应用 概念: awk是一个数据处理工具!相较于sed是对一整行的处理 ,而awk则是比较倾向于 把一行分成多个字段来处理 在linux 中常用的是gwak ,awk是gawk的链接文件 awk语法格式: awk [-F] ‘BEGIN{ print … } ...

    awk应用

    概念:
    awk是一个数据处理工具!相较于sed是对一整行的处理 ,而awk则是比较倾向于 把一行分成多个字段来处理
    在linux 中常用的是gwak ,awk是gawk的链接文件
    在这里插入图片描述
    awk语法格式:
    awk [-F] ‘BEGIN{ print … } 匹配规则{ 命令 } END{ print … }’ filename
    其中BEGIN和END 是awk的关键字 因此必须大写 ;两个部分是可选的可以写也可以不写
    (BEGIN和END 都只执行一次)
    awk的工作过程:
    在这里插入图片描述

    在这里插入图片描述

    awk的变量

    awk自定义变量
    1、-v varname=value 变量
    例如:
    在这里插入图片描述
    2、在awk{直接定义变量}
    例如:
    在这里插入图片描述
    3、引用 命令行定义的变量
    在这里插入图片描述
    awk内置变量
    $n 代表当前行的第n个字段
    $0 代表当前行的全部文本
    FILENAME 当前输入文件的名字
    FS 代表分隔符(默认是空格)
    NF 表示字段数
    NR 表示当前的行号
    FNR 表示各文件分别计数行号 (如果扫描多个文件的行号用FNR会单独统计不会连接在一起)

    (如果打印偶数行 NR%2==0就可以了)

    数组

    数组是一个包含一系列元素的集合
    格式
    abc[1]=”xiaohong”
    abc[2]=”xiaolan”
    abc就是数组名 【1】就是数组的下标 “xiaohong”就是数组的元素内容
    (使用字符串作下标要用双引号)
    删除数组元素
    delete abc[1] 就是删除abc数组中下标为1的元素

    展开全文
  • awk 应用实例

    2014-06-12 14:03:59
    awk 应用实例 ------------------------------------------------------------ author:hjjdebug date: Thu Jun 12 14:01:53 CST 2014 ------------------------------------------------------------ 1. 保存数据, ...

    awk 应用实例

    ------------------------------------------------------------
    author:hjjdebug
    date:  Thu Jun 12 14:01:53 CST 2014
    ------------------------------------------------------------
    1. 保存数据, 百变输出
    ------------------------------------------------------------
    输入数据:
    [hjj@Dell ~]$ cat input.txt
    goodsnum:  5  6  8  3  9  8  2
    price:     15 16 18 13 19 18 12

    awk 处理:
    [hjj@Dell ~]$ cat read.awk
    {
        for(i=2;i<=NF; i++){ #这里忽略第1列,从第2列开始存储
            if($0~/^goodsnum/)goodsnum[i]=$i
            if($0~/^price/)price[i]=$i
        }
    }
    END{
        for(i=2;i<=NF;i++) #数组下标0,1 未用
            print "item"i-1, "goodsnum:"goodsnum[i], "price:"price[i]
    }
    结果输出:
    [hjj@hjj ~]$ cat input.txt |awk -f read.awk
    item1 goodsnum:5 price:15
    item2 goodsnum:6 price:16
    item3 goodsnum:8 price:18
    item4 goodsnum:3 price:13
    item5 goodsnum:9 price:19
    item6 goodsnum:8 price:18
    item7 goodsnum:2 price:12

    这里演示了向数组赋值的一种方法,将域值直接赋值给下标数组变量
    ------------------------------------------------------------
    2. 强力搜索, 过滤输出
    ------------------------------------------------------------
    输入数据:
    [hjj@hjj ~]$ cat data.txt
    01-04 00:50:44.004 V/stbca   (  233): wReplyLen: 61 2F
    01-04 00:50:44.214 V/stbca   (  233): pbyOddKey: 29 AD 9C 72 58 3A 2B BD
    01-04 00:50:44.814 V/stbca   (  233): pDummyKey: 39 AD 3C A2 38 3A 5B 6D
    要求: 过滤输出,
    过滤条件:  过滤出带8个数据的行,并且(byte1+byte2+byte3) & 0xFF = byte4
    第一行: 有效数据个数不够,不过滤
    第二行: 过滤出. 满足条件: (0x29+0xAD+0x9C) & 0xFF = 0x72  0x72 == 0x72(byte4)
    第三行: 不满足sum条件, 不过滤 (0x39+0xAD+0x3C) & 0xFF = 0x22  0x22!=0xA2(byte4)

    强大的正则表达式,但grep 只能止步于此。不能满足第二个条件
    [hjj@hjj ~]$ cat data.txt |grep -E --color "([0-9A-Z]{2} ){7,}"
    01-04 00:50:44.214 V/stbca   (  233): pbyOddKey: 29 AD 9C 72 58 3A 2B BD
    01-04 00:50:44.814 V/stbca   (  233): pDummyKey: 39 AD 3C A2 38 3A 5B 6D

    awk 方案: 技巧都在代码里
    [hjj@hjj ~]$ cat search.awk
    {
        if(match($0,/([0-9A-F]{2} ){7,}/)) {
            str=substr($0,RSTART,RLENGTH) # match 提供了RSTART, RLENGTH
    #       print str
            split(str,a," ")
    #       print a[1]
            sum=strtonum("0x"a[1])+strtonum("0x"a[2])+strtonum("0x"a[3])
    #       printf "%x\n", sum;
            if(and(sum,0xff) == strtonum("0x"a[4])) print;  # bit 与书写确实有点烦
        }
    }

    输出结果:
    因为是扩展正则匹配,所以一定要加--re-interval, 否则匹配不到,无输出。
    [hjj@hjj ~]$ cat data.txt |awk -f search.awk
    [hjj@hjj ~]$ cat data.txt |awk --re-interval -f search.awk
    01-04 00:50:44.214 V/stbca   (  233): pbyOddKey: 29 AD 9C 72 58 3A 2B BD

    这里演示了另一种数组赋值方法:用split 把字符串直接分割到数组,数组下标是从1开始的。
    --------------------------------------------------------------------------------
    3. 提取时间信息
    --------------------------------------------------------------------------------
    a. 先看结果
    [hjj@hjj ~]$ echo "01-04 00:50:44.004 V/stbca" |awk -f time.awk
    00时 50分 44秒
    时间: 3044 秒

    b. 再看代码
    [hjj@hjj ~]$ cat time.awk
    func time(s)
    {
        split(s,a,":")  # split 数组下标从1开始
        print a[1]"时",a[2]"分", a[3]"秒"
        res=a[1]*3600 + a[2]*60 + a[3]
        return res
    }
    {
        if(match($0,/[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/))
        {
            str=substr($0,RSTART,RLENGTH);
            t=time(str)
            print "时间:", t, "秒"
        }

    }

     

    注意: awk 中,只有函数参数是局部变量,函数内声明的变量仍然是全局变量。

    仍然采用的是match,substr,split 方式把数据提取到数组。

    -------------------------------------------------------------------------------
    4. 将16进制字符流输出为字符串
    --------------------------------------------------------------------------------
    [hjj@hjj ~]$ echo  46464952 |awk '{for(i=1;i<length($0);i+=2) printf "%c", strtonum("0x"substr($0,i,2))}'
    FFIR

    echo "6c 65 6e 3a 32 30 30 00" |awk  '{for(i=1;i<=NF;i++) printf("%c", strtonum("0x"$i))}'

    len:200

    应用: 统计及计算, 给出结果。

    $ cat tj.awk
    {
            if($need~/[0-9.]+$/)
            {
                    if($need>9.8 && $need < 10)
                    {
                            n=10
                    }
                    else {
                            n=int($need)
                    }
                    a[n]++;
                    num++
            }
            else if($need ~ "%")
            {
                    print $need
            }
    }
    END {
            for(i in a)
            {
                    r=sprintf("%.2f", a[i]*100/num );
                    print i "\t" a[i] "\t" r "%";
            }
    }
    使用:

    $ awk -f tj.awk need=4 z.txt |sort -n
    -5      3       0.13%
    -4      2       0.09%
    -3      4       0.17%
    -2      6       0.26%
    -1      72      3.10%
    0       929     39.96%
    name%%
    1       671     28.86%
    2       310     13.33%
    3       145     6.24%
    4       69      2.97%
    5       38      1.63%
    6       13      0.56%
    7       13      0.56%
    8       10      0.43%
    10      40      1.72%

    -------------------------------------------------------------------------------

    5. 阶乘的计算

    -------------------------------------------------------------------------------

    [hjj@hjj ~]$ cat fac.awk
    # fac.awk
    function factorial(n,i,s)
    {
        s=1;

        for (i=1; i<=n; i++)
        {
            s *= i;
        }

        return s;
    }

    {
        for (i=1; i<=10; i++)
        {
            value = factorial(i);
            printf("fac(%d) = %d\n", i, value);
        }
    }
    [hjj@hjj ~]echo "" |awk -f fac.awk --dump-variable=1.tmp

    [hjj@hjj ~]$ cat 1.tmp
    ARGC: number (1)
    ARGIND: number (0)
    ARGV: array, 1 elements
    BINMODE: number (0)
    CONVFMT: string ("%.6g")
    ERRNO: number (0)
    FIELDWIDTHS: string ("")
    FILENAME: string ("-")
    FNR: number (1)
    FS: string (" ")
    IGNORECASE: number (0)
    LINT: number (0)
    NF: number (0)
    NR: number (1)
    OFMT: string ("%.6g")
    OFS: string (" ")
    ORS: string ("\n")
    RLENGTH: number (0)
    RS: string ("\n")
    RSTART: number (0)
    RT: string ("\n")
    SUBSEP: string ("\034")
    TEXTDOMAIN: string ("messages")
    i: number (11)
    value: number (3628800)


    前面是系统变量,后面两个是全局变量

    ----------------------------------------
    6. awk 查询字符ascii 值
    ----------------------------------------
    awk 由于不支持'A' 之类的字符类型,所以不能直接使用print, printf之类。
    但是它支持关联数组,下面的方法竟是先造出来一个ascii数组,
    这个数组以字符为下标。字符的值为数组值。
    把输入的字符串分割为字符,再打印这个ascii数组的值。
    $echo "ABCabc"|awk -F "" 'BEGIN{for(i=0;i<255;i++)a[sprintf("%c",i)]=i}{for(i=1;i<=NF;i++)print a[$i]}'
    65
    66
    67
    97
    98
    99

    $1, $2, $... 分别代表第一列内容,第二列内容,第...列内容, 内容就是字母或者数字.

    sprintf 的返回值仍然算一个字符串.

    技巧:先造出来一个256个元素的数组,其下标是256个字符,其值是字符数值,然后借助该数组,打印每个字符的值.

    ----------------------------------------
    7. awk 判别行尾是否为回车符
    ----------------------------------------

     echo -e "abc\r\n" |awk '{d=substr($0,length($0));if(d=="\r") print "tail is carriage";}'
     

    由于awk 没有字符的概念,所以用子串来进行判别. 当你能用awk处理字符类型问题时,感觉就前进了一步.

    写此脚本起因是用awk处理一个dos文件时, 曾用print 向新文件输出内容.结果用vim打开看,发现很多^M

    原因是dos文件以\r\n为回车, 输出原文件行,每行尾会有一个0x0d 回车符号.

    去掉^M 的方法:

    第一种方法: 对原文件的行都删掉最后一个字符,用awk '{sub(/.$/,"")} 但感觉粗暴了一些,

    第二种方法:先判断一下最后一个字符是否为回车0xd.

    if(substr($0,length($0)=="\r") $0=substr($0,1,length($0)-1)

    第三种方法: 还保留原来的dos格式输出. 就是你新添加的行,也要以\r\n来结尾, 这只需要你在print 是, 加上"\r"

      就可以了,

    总结: 出现很多^M 的原因是,有的行以\r\n结尾,有的行以\n结尾, 所以显示时, 按unit格式显示,就多出了很多^M(回车符号)

    而如果全是\r\n,则为dos格式,不会有^M出现! 用awk 可以挑选你最喜欢的办法去处理, 建议第3种.

    技巧:awk没有字符的概念,只有字符串的概念,故用取子字符串方式来比较.

     

    展开全文
  • awk应用技巧

    2020-12-23 20:54:41
    awk的基本用法 awk是一个灵活强大的文本处理工具,其基本使用命令格式如下: awk [ -F fs ] [ -v var=value ] ‘pattern {action}' [ file | - ... ] 上述awk命令包含三个基本部分: 选项部分。包括-F选项指定...
  • awk应用案例

    2019-09-19 16:20:29
    awk并非一个简单命令,它其实是一门编程语言,适合处理文本类数据,awk处理文本是以记录(文本中的行)为单位的,它会遍历文件的每条记录并进行处理 awk语法格式: awk 'Pattern {Action}' filename awk工作原理:awk...
  • AWK应用实战

    2020-11-10 21:33:52
    1、AWK 日志分析统计 # 统计一个时间范围内访(pv)问量 grep '31/Oct/2020' access.log | wc -l awk '$4>="[05/Sep/2020:08:00:00" && $4<="[05/Sep/2020:09:00:00" {print $0}' access.log...
  • Awk 应用小结

    2012-02-10 14:59:20
    Awk 应用小结 调用: 1.调用awk: 第一种方式:命令行方式 awk [-F field-separator] 'commands' input-file(s) [-F域分隔符]是可选的,因为awk使用空格作为缺省的域分隔符,因此如果要浏览域间有空格的文本...
  • awk应用-信息的检索

    2015-06-28 19:41:49
    awk应用-信息的检索 awk程序可以用于检索数据库中的信息,数据库实际上是各种类型的文本文件。文本文件的结构化越好,对其处理就越容易工作,尽管这个结果不过是由独立的单词组成的行。 下面这个首字母...
  • linux awk应用详解

    2009-10-28 18:53:32
    linux awk应用详解 awk变量名 含义ARGC 命令行变元个数ARGV 命令行变元数组FILENAME 当前输入文件名FNR 当前文件中的记录号FS 输入域分隔符,默认为一个空格RS 输入记录分隔符NF 当前记录里域个数NR 到目前为止...
  • grep awk应用

    2019-08-20 10:41:40
    id=`ps -ef | grep PlatShelfMonitor|grep -v "grep"| awk '{print $2}'` echo $id kill -9 $id echo "run new PlatShelfMonitor" /home/VER/PlatShelfMonitor >>/dev/null & echo "run successs" echo "----...
  • awk应用示例

    2017-09-25 14:54:51
    求文件中某一列的平均数 ---------------------------------- awk 'BEGIN{sum=0.0;num=0}{sum+=$1;cnt++}END{printf "avg:%.2f",sum/cnt}' data.txt
  • awk应用总结

    2019-04-02 23:41:54
    如果awk程序过多,可以从文件读入awk程序。awk -f awk_file filename   cat /etc/group| awk -F: '{ print $1;print $2 }' 。awk中以分号分隔的是两条语句,这种输出结果是先输出第一行的第一个字段,换行,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,805
精华内容 722
关键字:

awk应用