AWK 基础篇

AWK来源

    AWK是一种处理文本文件的语言,是一个强大的文本分析工具。之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。

   目前有多种版本主要用的有:New awk(nawk),GNU awk( gawk),这里介绍gawk


基本语法:

  awk [option] 'program' var=value file...

    其中program格式:

      pattern{action statements;...}

      pattern设定过滤条件

      action statements对数据进行处理,放在{}内,执行动作涉及print,printf。

      如果省略action则默认执行print $0(打印所有所有域内容,$0含义稍后介绍)

  awk [option] -f programfile var=value file...

    将program部分放入文本中的使用方式

  awk [option] 'BEGIN{action;...}' pattern{action;...}END{action;...}' file...

    在BGEIN,END在输出结果前、后加入指定内容,类似于页眉页脚

  选项:

      -F指每一条记录record(行)的字段(域field)分隔符

        通过-F指定字段分隔符后每个域被依次标记为$1,$2,$3..$n这样后续通过标识方便引用。

        $0为所有域即整个记录。

        这里的$n标识和shell中的$符是不同含义

      -v var=varlu 定义变量包括自定义变量和内部变量


AWK工作原理

  1.执行BGEIN{action;...}语句块,进行“页眉”格式化

  2.从文件或者标准输入读取第一条记录(行)然后通过pattern{action;...}处理,这个过程从第一行到最后一行重复逐行扫描

  3.当读到最后一条记录时,执行END{action;...},进行“页脚”格式化

    BGEIN/END是可有可无的。并且如果没有pattern{action;...}默认会执行{print},即会打印读取到的每一条记录


print输出

  print是action的一种具体实现,它的格式:print item1,item2,...

    item之间使用逗号分割符

    item可以是字符串,数值;也可以是变量或awk表达式

    如果省略item则相当于print $0

      示例:

        awk '{print "day day up"}' /etc/hosts

        awk1.PNG

        awk -F. '{print "zxzz"}' /etc/hosts

        awk2.PNG

        awk -F: '{print $1}' /etc/passwd

        awk3.PNG

        awk -F: '{print $0}' /etc/passwd

        awk -F: '{print $1" \t"$3}' /etc/passwd

        awk4.PNG

        以上" \t"表示输出域时,位于域之间的符号


        tail -3 /etc/fstab | awk '{print $2,$4}'

        awk5.PNG


AWK变量:分为内置变量和自定义变量,使用选项-v 定义

  内置变量:

    FS:输入字段分隔符,默认为空白字符

      awk -v FS=':' '{print $1,FS,$3}' /etc/passwd 或 awk -F: '{print $1,":",$3}' /etc/passwd

      awk6.PNG

       awk7.PNG

    OFS:输出字段分隔符,默认为空白符

      awk -v FS=':' -v OFS="'s userid is " '{print $1,$3}' /etc/passwd

      awk8.PNG

    RS:输入记录分隔符,指定输入时的换行符

      echo "aaa@23b@ss@@edu" | awk -v RS='@' '{print}' | cat -A

      awk9.PNG

    ORS:输出记录分隔符,输出是用指定符好替代换行符

      awk -v RS='' -v ORS='###' '{print}' /etc/passwd

      awk10.PNG

    NF:单行字段总数量

      awk -F: '{print NF}' /etc/passwd

      awk -F: '{print $NF}' /etc/passwd

      awk11.PNG

      awk12.PNG

      awk13.PNG

    NR:记录号

        awk14.PNG

        awk15.PNG


    FNR:各文件分别计数,记录号

      awk '{print FNR}' /etc/fstab /etc/inittab
  FILENAME:当前文件名

      awk '{print FILENAME}’ /etc/fstab
  ARGC:命令行参数的个数

      awk '{print ARGC}' /etc/fstab /etc/inittab

      awk 'BEGIN {print ARGC}' /etc/fstab /etc/inittab

      awk16.PNG
  ARGV:数组,保存的是命令行所给定的各参数

      awk ‘BEGIN {print ARGV[0]}’ /etc/fstab /etc/inittab

      awk ‘BEGIN {print ARGV[1]}’ /etc/fstab /etc/inittab

      awk17.PNG

  

  自定义变量:

    (1) 选项跟参数定义-v var=value

    (2) 在program中直接定义

        先引用再定义:

         awk18.PNG

        先定义再引用:

         awk19.PNG

        

printf格式化输出命令

    printf "FORMAT",item1,item2,...

        (1)必须指定FORMAT

        (2)不会自动换行,需要显示给出换行控制符,\n

        (3)FORMAT中需要分别为后面每个item指定格式符

    格式符:与item一一对应

        %c 显示字符的ASCⅡ码

        %d,%i 显示十进制整数

        %f 显示为浮点数

        %e,%E 显示科学计数法数值

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

        %s 显示字符串

        %u 无符号整数

        %% 显示%自身

    修饰符:

        #[.#]:第一个数字控制显示的宽度;第二个#表示小数点后精度,%3.1f

        -: 左对齐(默认右对齐) %-15s

        +:显示数值的正负符号 %+d

    以下几个示例:

        awk20.PNG

        awk21.PNG

        awk22.PNG

        awk23.PNG


操作符

    比较操作符:

        ==,!=,>,>=,<,<=

    模式匹配符

        ~:左边是否和右边匹配包含 !~:是否不匹配

        示例:

        awk -F: '$0 ~ /root/{print $1}' /etc/passwd 每读入一条记录使用$0调用然后通过~匹配符去匹配包含root的记录,匹配成功再执行print

        image.png

        awk '$0 ~ /^root/' /etc/passwd 读入记录去匹配行首以root开头的记录,由于没有指定action所以默认执行{print}

        image.png

        awk -F: '$3 <= 30{print $0,NR}' /etc/passwd 以:为域分隔符,找出第三域小于等于30(即UID)的行打印整行和行号

        image.png

    逻辑操作符

        逻辑与&&,逻辑或|| ,逻辑非!

        awk -F: '$3==0||$3>=1010 {print $1}' /etc/passwd

        image.png

    条件表达式(三目表达式): selector?if-true-expression:if-false-expression

        awk -F: '{$3<=30?usertype="Common User":usertype="Sysadmin or SysUser";printf "%-15s:%-20s%-4s\n",$1,usertype,$3}' /etc/passwd

        image.png


以上是awk一些基本使用技巧,也是平时使用较多的知识点,需要不断的练习

        

        

        


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值