Awk格式化输出/内置字符串函数/数组

时间:2021-08-13 16:03:54


一、格式化输出

 

      awk一大主要功能就是产生报表,报表就要按照预订的格式输出,awk借鉴C,也定义了printf输出语句,它可以规定输出的格式,printf基本语法如下:

      printf(格式控制符,参数)

     由上可知 printf语句包含两部分:格式控制符,以 % 开始,描述格式规范;参数列表,比如变量名列表,与格式控制符相对应,为输出对象。示例:

          awk '{printf (“%s\t%d\n”,$2,$8)}'     输入文件

      指令中,%s$2对应,%d$8对应。

 

       格式控制符有分为printf修饰符 和格式符两种:

 

                                               printf修饰符及意义

 

              修饰符

                             意义

                  -

                           坐对齐

               width

                           域的步长

               .prec

                      小数点右边的位数

 

                                          Printf格式符及意义

 

                     格式符

                             意义

                       %c

                       ASCII字符

                       %d

                       整形数

                       %e

                       浮点数,科学记数法

                       %f

                       浮点数

                       %o

                       八进制数

                       %s

                       字符串

                       %x

                       十六进制数

 

  示例:awk '{printf(“%10.3f\n”,2009.1012)}'

      

             其中, width = 10,表示浮点数长度控制在10位;.prec = .3,表示小数点后3位。

 

我们可以总结出printf修饰符一般的形式: %-width.prec 格式控制符

 

 

二、内置字符串函数

 

       awk提供了强大的内置字符串函数,用于实现文本的字符串替换、查找以及分隔功能:

                     

                                                   awk字符串及意义

             函数

                          意义

        gsub(r,s)

          在输入文件中用s替换 r          (作用于全部域 $0)

        gsub(r,s,t)

          t中用s替换 r                      (作用于全部域 t)

        index(s,t)

          返回s中字符串第一个t的位置

        length(s)

          返回s的长度

        match(s,t)

          测试s是否包含匹配t的字符串

       (成功,返回t的首位置;失败,返回0)

        split(r,s,t)

          t上将r分成序列s(以t为分隔符,将r拆分成字符串数组s

        sub(r,s,t)

          t中第一次出现的r替换为s

        substr(r,s)

         返回字符串r中从s开始的后缀部分

        substr(r,s,t)

         返回字符串r中从s开始长度为t的后缀部分

 

 

三、向awk脚本传递传递参数

       awk脚本内的变量可在命令中进行赋值,实现像awk脚本传递参数,格式为:

 

      awk脚本 parameter=value输入文件

 

           变量赋值放在脚本之后,输入文件之前,=两端不能有空格。

           awk所传递的参数可以是自定义变量,也可以是系统变量。

注意:命令行参数不能被BEGIN字段访问。

 

四、条件语句和循环语句

 

      awk的条件语句和循环语句与C语言的语法完全相同。

      可以使用匹配符和正则表达式作为if语句的条件。示例:

       

       ifx ~ /helo/ print x              x中匹配模式 helo,将其打印

 

五、数组

      

     awk数组的形式与C相同,但是,awk数组无需定义数组类型和大小,可以赋值后直接使用,

基本格式:

     array[index] = value

 

关联数组
  1. 关联数组是指数组的索引可以是字符串,也可以是数字。关联数组在索引和数组元素之间建立起关联,

    对每一个数组元素,awk自动维护了一对值:索引和数组元素值。关联数组的值无需以连续的地址进行存储,

    所以,关联数组即便可以通过数字作为索引,但是,该数字索引并不表示数组存储地址的信息。awk的所以数组都是关联数组,这是awk数组与其他编程语言数组的本质区别。

           字符串和数字之间是有明显差别的,例如,arry[09]arry[9]二者就不能指定到数组中相同的值。

     

    awk也特别定义了一种for循环来访问关联数组,语法形式:

                for(variable in array)

                  dosomething with array[variable]

    variable是任意指定的变量。

     

    关键字in也可以在条件表达式中判断元素是否在数组中,语法格式如下:

           indexin array

    array[index]存在,返回1,反之,返回0. 

        

split

 split(r,s,t)函数将字符串以t为分隔符,将r字符串拆分为字符串数组,并存放在s中。

       

数组形式的系统变量

awk系统变量中ARGVENVIRONARGCARGV数组中元素的个数,这一点和C相同。

ENVIRON的索引是环境变量名,可以通过环境变量名直接得到其值:

 

ENVIRON[“USER”]

ENVIRON[“OLDPWD”]

 

环境变量名要放到双引号里面。


本文完全参照           <linux shell 编程从初学到精通>    华清远见嵌入式培训中心  伍之昂等编著