• Linux--shell的awk--10


    一、awk介绍

    全称:由Aho Weinberger Kernaighan三个人的首字母组合而成

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

    awk是一种单独的编程语言解释器

    awk报告生成器:通过模式匹配以及自己本身的语言格式,来获取并输出客户所需要的内容

    示例:获取系统上面用户id大于1小于等于500的用户的用户名和用户ID

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

    二、awk工作原理

    1、依次把匹配到的行,使用awk工具进行编辑

    2、$0表示整行,$1代表第一个…,$NF代表最后一个

    3、pattern;通过模式匹配对应的字段过滤行;

    4、通过对应的命令 printf 做格式化输出

    三、awk用法

     awk [option] … 'program' FILE

    注意:

    1、program 必须使用单引号

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

    awk '{print}' /etc/passwd   #默认打印$0

    四、awk常见选项(option)

    -F  指定分隔符,默认是空格

      -F[:] 指定多个分隔符

    例:
    awk -F[:] '{print $3,$5,$7}' /etc/passwd   指定 : 和 / 为分隔符

    -v  手动指定变量参数

    awk -v a="a/b" 'print a' a.txt

      1、a是自定义变量

      2、在awk中调用变量不用加$符号

    cut与awk的区别

      awk 以空格为分割域时,是以单个或多个连续的空格为分隔符的;

    cut则是以单个空格作为分隔符。

    五、awk的语法格式----program

    1、print

    默认输出(在屏幕上)

    在awk中没有保存命令,我们可以关联其他命令(tee)来保存

    2、printf  实现格式化输出

    输出格式:printf  "xxx %-10s xxx %-10d ",name,num 

    格式符:

      %s   显示字符串

      %d %i  显示数值

      %c   显示ASCII

      %e %E 科学计算方式

      %f    显示浮点数

      %u  无符号整数

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

    修饰符:

      默认为右对齐

      -        代表左对齐

        %5.4f  代表占位数为5,小数位有4位  

    3、变量

    内置变量----环境变量(bash)

      awk语言所默认支持的变量

      FS   定义输入分隔符的变量

      OFS  定义输出分隔符的变量

      NF($NF) 分割以后的最后一列的变量,变量引用的时候不用加$

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

      FNR 定义文件行数时,只计算自己的行号

      FILENAME  存储文件名字

      BEGIN  只执行一次后面的命令

    awk 'BEGIN{print "xxx"}{print$3}' /etc/passwd

      ARGC  整个 命令参数 的段数  不包含ARGC命令本身

      ARGV  用来调取命令中指定的段

    awk '{print ARGC}' /etc/passwd       ==  2
    awk '{print ARGV[2]}' /etc/passwd    == /etc/passwd

      RS  指定换行符,默认为 ,可以指定新的换行符,不影响默认符号

      ORS  输出时替换默认换行符

    awk -v ORS="@" '{print}' /etc/passwd

      自定义变量

        -v 变量=值

    在后面’program’中去调用自定义变量时,直接使用即可或者将”变量=值”语句写到program即可

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

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

    b) 对m~n行进行操作

    awk 'NR>=1&&NR<=3{print}' /etc/passwd     打印1到3行

    c) pattern匹配的行 /pattern/

    awk '/r..t/{print}' /etc/passwd

    d) /pattern1/,/pattern2/ 第一次pattern1到第一次匹配pattern2的行

    awk '/root/,/user1/{print}' /etc/passwd

    练习:判断/patern1/,/pattern2/之间行的用户是bash用户,并显示用户名

    awk -F: '/^root/,/user1/{if($NF=="/bin/bash");print $1,$3}' /etc/passwd

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

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

    f) BEGIN定义在默认循环进行操作前所要执行的语句

    awk -F: 'BEGIN{printf "shell程序为bash:
    "}$NF=="/bin/bash"{print $1,$3}' /etc/passwd

    g) END 定义在循环结束后执行

    awk -F: $NF=="/bin/bash"{print $1,$3} 'END{printf "end
    "}' /etc/passwd

    5、操作符

    运算操作符

      +  -  *  /  %  ^(乘方)  //

    比较运算符

      >  <  ==  !=  >=  <=  ~(等于)  !~

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

    逻辑操作符

      &&  ||  !

    赋值操作符

      =  +=  -=  /=  *=  %=  ^=  //=

    条件表达式

      条件语句? 条件成立语句;条件不成立语句

    awk '/^title/{NF<=2? print; print "参数过少"}' /boot/grub/grub.conf

    6、常见action

      print printf 以及它任何命令的操作都是action

    a) expressions

    b) input statements输入语句

    c) 组合语句 compound statements /pat1/{{ }{ }}

    d) control statements 控制语句 例如 if  while等

    e) output statements 输出语句

    7、常见语言

    a) if语句

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

    awk '/^title/{if(NF<=2){print} else {print "error"}}' /boot/grub/grub.conf

    b) while语句

      只有对行参数进行遍历的时候才使用while语句

      语法格式:初始值 while(条件表达式){循环体;初始控制语句}

    c) for语句

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

    d) do-while语句

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

    e) 跳出循环语句

      break [n]  跳出n次循环

      continue  跳出本次循环

      next      跳出默认的当前循环  NR%2==1 next 跳过奇数行

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

    f) switch语句(类似case)

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

    8、数组

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

    注意:awk中数组不用定义,只要使用,就有值为空的默认数组

    行遍历:整个文件进行遍历

    列遍历:取对象的某一列进行遍历

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

    练习统计/etc/fstab中每个单词(以空格隔开的词)的次数

    awk -v RS=" " '{print}' /etc/fstab | awk '{a[$1]++}END{for(i in a){printf "%-50s = %-2d
    ",i,a[i]}}'

    9、函数

    内置函数:

      length()  统计字符串长度

        数学上使用的函数 sin() cos() tan() …

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

    awk -F: '{print sub(o,O,$1) }' /etc/passw第一列第一个o替换为O

      gsub(x,x,x)  替换该行所有匹配到的所有值

    awk -F: '{print gsub(o,O,$1) }' /etc/passwd第一列所有o替换为O

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

    netstat -tan | awk '/^tcp>/{split($5,ip,":");print ip[1]}'
  • 相关阅读:
    希望多年以后的自己不再如此迷茫
    【转载】撒旦(Satan 4.2)勒索病毒最新变种加解密分析
    java单例模式
    关于double/float 两种基本类型精度丢失的总结
    关于ecplise中一些很实用的技巧
    安装SQL Server和卸载SQL Server步骤
    我进入部门的第一周
    mysql数据库在Linux和windows下免安装实现以及框架开发碰到的问题
    jenkins发布docker到mesos
    u盘作为git仓库,完成不同地方的代码同步
  • 原文地址:https://www.cnblogs.com/gxnihao/p/11419882.html
Copyright © 2020-2023  润新知