• awk补充


    4、模式匹配(地址定界)
      1、空值,没有定义,默认就将文件中所有的行,放入awk进行循环
      2、对固定的1-3行进行操作
        sed -n '1,3p' /etc/passwd
        awk '1,3{print}' /etc/passwd(错误用法) //awk默认不支持使用1-3 1,3这样数值的直接写法
        awk 'NR>=1&&NR<=3{print}' /etc/passwd //通过NR变量来指定
      3、/pat1/
        sed -n /r..ter/p /etc/passwd
        awk '/r..ter/{print}' /etc/passwd
      4、/pat1/,/pat2/ 第一次匹配pat1到第一次匹配pat2之间的行
        awk '/sshd/,/over/{print}' /etc/passwd

        练习:判断/^r..ter/,/^user.*>/之间的行的用户,是bash的用户,并显示用户的用户名,和UID
          awk -F: '/^r..ter/,/^user.*>/{if($NF==/bin/bash);print $1,$3}' /etc/passwd
      5、模式匹配可以直接使用判断语句
        awk -F: '$NF=="/bin/bash"(print $1,$3)' /etc/passwd
      6、BEGIN和END
        BEGIN定义在默认循环进行操作前所要执行的语句;
        awk -F: 'BEGIN{printf "shell程序为bash的用户为: "}$NF=="/bin/bash"{print $1,$3}' /etc/passwd
        awk -F: 'BEGIN{printf "shell程序为bash的用户为: "}$NF=="/bin/bash"{print $1,$3}END{printf "end "}' /etc/passwd


    5、操作符
      运算操作符:
        + - * / %(取模) ^(幂) //(向下取整)
      比较运算符:
        == != > < >= <= ~!~

      逻辑操作符:
        &&
        ||
        !
      赋值操作符:
        = += -= /= *= %= ^= //=
      条件表达式:
        条件语句?条件成立语句;条件不成立的语句

    6、常见action
      print、printf以及其它任何命令的操作都是action
      1、expressions 常见表达式
      2、control、statement控制语句 例如:if、while等
        逻辑关系语句判断来进行结合
      3、组合语句compound、statements
        /pat1/{{}{;}}
      4、input、statements 输入语句
      5、output、statements 输出语句


    7、常见语言(if while do for break continue delete switch)
      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语句
        语法格式:while(条件表达式){循环体}

        练习:过滤grub.conf文件中kerne这一行,然后每一个参数的字符个数进行统计,并显示出来
          awk '/^[[:space:]]*kernel>{i=1;while(i<=NF){print length($i);i++}}' grub.conf

      3、for语句
        语法格式:for(初始值,条件判断;初始值控制语句){循环体}
        awk '/^[[:space:]]*kernel>/{for(i=1;i<=NF;i++){printf $i" ";print length($i)}}' grub.conf
        循环建议使用for语句

        在awk中,for语句也可以使用和shell中一样的格式:
        for(i in 列表){循环体}
        echo "liang hao tian shi ge guai bao bao"

      4、do-while循环
        语法格式:do{循环体} while(循环条件)
        注意和while的区别:while语句只有在满足条件的时候,才会进入循环,而do-while会先执行循环体(一次,再进行条件判断)

      5、循环跳出语句
        break[n] 跳出n次循环
        continue 跳出本次循环
        next 跳出默认的当前循环
        awk '{if(NR%2==1){next}else{print}}' /etc/passwd

      6、switch类似于case
        语法格式:
        switch(表达式){case 模式匹配值:执行语句;case 模式匹配值:执行语句;...default:执行语句}


    8、数组
      在awk中,数组和shell中的数组特性相同;
      注意:awk中数组不用定义,只要使用了,就有值为空的默认数组,这在做数据统计的术后非常常见!!!
      行遍历 --> 实际上就是整个文件的遍历
      列遍历 --> 取对象固定某列中的,相同数据的统计
      注意:数组通过for语句,再给其它变量进行赋值的时候,赋值的是index索引信息;

    9、函数
      1、内置函数
        函数的调用:funcation(参数)
        length() 统计字符串长度
        数学运算上使用的函数,例如:sin()、cos()、tan()
        sub(x,x,x) 替换第一个匹配到的值
        awk '{print sub(o,O,$1)}' /etc/fstab //将文件中第一列的o替换为O
        gsub(x,x,x) 替换该行所匹配到的所有值
        split(x,x,x) 指定分隔符去切割文件
        netstat -tan | awk '/^tcp>/{split($5,ip,":");print ip[1]}'

      2、自定义函数

  • 相关阅读:
    learnyou 相关网站
    hdu 3038 How Many Answers Are Wrong
    hdu 3047 Zjnu Stadium 并查集高级应用
    poj 1703 Find them, Catch them
    poj 1182 食物链 (带关系的并查集)
    hdu 1233 还是畅通工程
    hdu 1325 Is It A Tree?
    hdu 1856 More is better
    hdu 1272 小希的迷宫
    POJ – 2524 Ubiquitous Religions
  • 原文地址:https://www.cnblogs.com/4443056bdH/p/11397915.html
Copyright © 2020-2023  润新知