AWK 基础篇

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

        技术分享图片

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

        技术分享图片

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

        技术分享图片

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

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

        技术分享图片

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


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

        技术分享图片


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

  内置变量:

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

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

      技术分享图片

       技术分享图片

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

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

      技术分享图片

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

      echo "[email protected]@[email protected]@edu" | awk -v RS='@' '{print}' | cat -A

      技术分享图片

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

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

      技术分享图片

    NF:单行字段总数量

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

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

      技术分享图片

      技术分享图片

      技术分享图片

    NR:记录号

        技术分享图片

        技术分享图片


    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

      技术分享图片
?  ARGV:数组,保存的是命令行所给定的各参数

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

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

      技术分享图片

  

  自定义变量:

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

    (2) 在program中直接定义

        先引用再定义:

         技术分享图片

        先定义再引用:

         技术分享图片

        

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

    以下几个示例:

        技术分享图片

        技术分享图片

        技术分享图片

        技术分享图片


操作符

    比较操作符:

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

    模式匹配符

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

        示例:

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

        技术分享图片

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

        技术分享图片

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

        技术分享图片

    逻辑操作符

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

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

        技术分享图片

    条件表达式(三目表达式): 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

        技术分享图片


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

        

        

        


以上是关于AWK 基础篇的主要内容,如果未能解决你的问题,请参考以下文章

文本三剑客之awk进阶篇

linux基础篇07,linux文本处理cat more less head tail sort uniq grep cut jion sed awk

技能篇:awk教程-linux命令

Linux基础篇五:文件操作篇(三剑客)

Linux篇--awk的使用

技能篇:awk教程-linux命令