运维开发网
广告位招商联系QQ:123077622
 
广告位招商联系QQ:123077622

牛皮的awk命令

运维开发网 https://www.qedev.com 2020-07-11 15:46 出处:网络
  1、awk介绍【单独的编程语言解释器】   全称Aho Weinberger Kernaighan三个人的首字母缩写;   1970年第一次出现在Unix机器上,后来在开源领域使用它;   所以,我们在Linux中使用,改名

 

1、awk介绍【单独的编程语言解释器】

   全称Aho Weinberger Kernaighan三个人的首字母缩写;

   1970年第一次出现在Unix机器上,后来在开源领域使用它;

   所以,我们在Linux中使用,改名为GNU awk;所以,在Linux 上实际上叫做gawk;

   grep行过滤器

      参数:-o只显示匹配内容   -i忽略大小写    -v取反    -E使用扩展正则表达式

   sed行编辑器

      参数:-n取消默认输出     p打印

      使用方式有:地址定界,正则表达

      命令:p     a       i       w        c         s   

   awk报告生成器

      通过模式匹配以及自己本身的语言格式,来获取、并输出客户所需要的内容;

      awk -F: ‘{if($3>=1&&$3< = 500){print $3}}‘ /etc/passwd

      # awk最后实现这个功能的时候只需要一句话就可以!

      格式化输出的意义:

      awk -F:-V OFS="." ‘BEGIN{printf”username      udi         \n===================\n"{if($3>=18&$3<= 500){printf "用户名:%-10s UID:%-10d\n",$1,$3}END{printf"\------------------------------\nend\n"}‘ /etc/pass

2、awk工作原理

   依次把匹配到的行使用awk工具进行编辑或者格式化打印输出,所以关于行的循环,在awk中,就可以不使用了

3、awk的用法

 awk   参数...    ‘‘    FILE..

   1)program必须使用单引号

   2)多条program语句使用大括号包含起来,可以并列,可以嵌套

      awk ‘print‘ /etc/passwd

4、awk的常见参数

   -F     指定分割符    还可以指定多个     awk -F[/:]

   -v     因为awk是一种语言编译器,能自己定义变量们同事也有内置变量(与环境变量类似)

      而-v就是手动指定参数

      awk -v a =“a/b”‘{print a}‘ a.txt    给a赋值,打印a这个变量

      1)a是自定义变量 -v FS":"

      2)在awk中调用自定义变量不用加$符号

         awk ‘{a="a/b";print a}‘ a.txt

5、awk的语法格式  --program

   1)print

      默认输出 (在屏幕上显示)

      在awk中没有保存命令,我们可以关联别的命令来保存结果

   2)printf--实现格式化输出

      printf "%s是%d班的最好的学生",变量1,变量2

      格式符:

         %s

         %d  %i   数值

         %e  %E   科学计算数

         %c Acs值、

         %f浮点数

         %%逃逸符,只显示%自己

         %u无符号整数

      修饰符:

         默认为右对齐

         - 代表左对齐

         %5.4f      5表示所占位数      4所取小数位

 3)变量(内置变量、自定义变量)

    内置变量--环境变量(bash)查看环境变量命令(env 、set -C  +C)

        awk语言所默认支持的变量

        FS 定义输入分隔符的变量

        OFS定义输出分隔符的变量

        NF     定义分割以后的参数个数($NF 分隔以后最后一列变量)

        NR 定义文件的行数,定义多个文件的文件的行号叠加

        FNR 文件只计算自己的行号

         awk {print NR}‘ /etc/fstab /etc/passwd

         awk ‘{print FNR}‘ /etc/fstab /etc/passwd

            FILENAME存储文件的名字

         awk ‘{print FILENAME}‘ /etc/passwd //把文件名打印N次, N文件的行数

         awk ‘BEGIN{print FILENAME}‘ /etc/passwd //BEGIN的意思是只执行一次这个打印

            ARGC 整个命令的段数   【不包含program本身】

         awk ‘BEGIN{print ARGC} /etc/passwd /etc/fstab /etc/shadow

            ARGV数组,来调取命令中,指定的段例如ARGV[2]

            RS   指定换行符     可以指定心的换行符,不影响本身的换行

            ORS   输出的时候指定换行符,将默认换行符替换为指定换行符

    自定义变量

       -v  变量=值

          在后面的‘program‘中去调用自定义变量时4,直接使用即可

         或者将“变量=值”直接写在‘program‘里面

6、模式匹配(地址定界)

         1)空值,没有定义,默认就将文件中的所有的行,放入awk进行循环

         2)对固定的1,3行进行操作

              awk ‘1,3{print}‘      #注意awk默认不支持1-3 1,3等等

              awk  ‘NR>=1&&NR<=3;{print}‘  /etc/passwd

         3)匹配

              awk ‘/r..ter/{print}‘   /etc/passwd

         4)匹配模式可以直接使用判断语句

              awk -F: ‘$NF =="/bin/bash"{print $1,$3}‘ /etc/passwd

         5)BIGEIN|END语句

         BIGEIN定义在默认循环进行操作前要执行的语句

             awk -F: ‘BEGIN{printf "shell程序为bash的用户为: \n"}$NF=="/bin/bash"{print $1,$3}‘ /etc/passwd

             awk -F: ‘BEGIN{printf "shell程序为bash的用户为: \n"}$NF= = "/bin/bash"{print $1,$3}END{printf "end\n"}‘

             一般在格式化输出的时候,打印表头和表末;

7、操作符    

     运算操作符:

        + - * / % ** //

     比较运算符:

        ==  !=   > < >=    <=

        ~!~

        awk -F: ‘$NF~"/bin/bash" {print $1,$3}‘ /etc/passwd

        awk -F: ‘$NF!~ "/bin/bash"{print $1,$3}‘ /etc/passwd

     逻辑操作符:

        &&

        ||

        !

     赋值操作符:

        =  +=  -= /= *=

     条件表达式:

        条件语句?条件成立语句

8、常见action

     print  printf 以及其他任何操作都是action

9、常见语言

   1)if语句

      语法格式:if(条件表达式){执行语句}

         if(条件表达式){执行语句} else{执行语句}

         awk ‘/^title/{if(NF <= 2) {print}else {print 参数过少}}’ /boot/grub/grub.conf

         awk ‘/title/{if(NF<=2) print $4}‘ /boot/grub/grub.conf

   2)while语句

        只有对行参数进行遍历的时候才会使用循环;

        语法格式:while (条件表达式){循环体}

        awk /^[[:spacel]*kernel\> /{i= 1;while(i< = NF){printf $i"\t";print length($i);i+ + }}‘ grub.conf

   3)for语句

        语法格式:for(初始值;条件判断初始值控制语句){循环体}

       awk ‘/^[[:space:]*kernel\> /{for(i=1; i<=NF; i++){printf $i"\t"; print length($)}} grub.conf

        循环建议使用for语句

   练习:统计一下啊某个文件中指定行中单词出现的次数;

      在awk中,for也可以使用shell中一样的格式:

      回顾:

         for i in 列表;do

          循环体

         done

        for(i in 列表){循环体}

        echo "xia liang z shi k hen n shuai da fa le"|awk

    4)do-while循环

        语法:do {循环体}while(循环条件)

        注意和while的区别:while语句只有在满足条件的时候,才会进入循环,而do while会先执行一次循环体,再进行条件判断

   5)循环跳出语句

      break [n] 跳出本次循环;

      continue 跳出本次循环;

      next 跳出默认的当前循环;

     awk ‘{if(NR%2==1){next}else {print}}‘ /etc/passwd

   6)switch类似于case

      语法格式:    

       switch(表达式){case 模式匹配值;执行语句;case 模式匹配值;执行语句。。。,default ;执行语句}

10、数组

     在awk中,数组和shell中的数组特性相同;

        注意:awk中数组不用定义,只要使用了,就有值为空的默认数组;这在做数据统计的时候非常常见

     行遍历--->实际上就是整个文件的遍历

     列遍历--->取对象固定某列的中的,相同数据的统计

        注意:数组通过for语句,再给其他变量赋值的时候,赋值的是index索引信息

     练习:统计一下某个文件中指定行中单词出现的次数;

       awk -v RS=" " {print} a.txt | awk "{ls[$1]+ +}END{for(i in ls){print ls[[i]}}‘

     练习:统计-下一个文件中每个单词(以空格隔开的字符串)出现的次数;

       awk ‘{for(i= 1;i< =NF;i+ +){count[$i]+ +}}END{for(i in count) {print i,count[i]}‘ /etc/fstab

       awk ‘{for(i= 1;i< =NF;+ +){ls[$i]+ + }END{for (j in Is){print j ,ls[j]}"‘ /var/log/httpd/access log | sort -t" " -k2 -nr

11、函数

   1)内置函数

        函数的调用:funcation(参数)

        length()统计字符串长度

        数学运算上使用的行数sin()

        sub(x,x,x)替换第一个匹配到的值

           awk  ‘{print sub(o,O,$1)}‘ /etc/passwd //将o替换为O文件中的第一列(匹配一个)

        gsub

           awk  ‘{print gsub(o,O,$1)}‘ /etc/passwd将o替换为O文件中的第一列(全部匹配)

        split(x,x,x)指定分隔符去切割文件

           netstat -tan | awk ‘/^tcp\> /{split($5,ip,":");prin ip[1]}‘

           netstat -tan | awk ‘/^tcp\> /{split($5,ip,":");counti[ip[1]]+ +}END{for (i in count) {print i,count[i]}}‘

 2)自定义变量 

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号