awk

作者: li_zw | 来源:发表于2018-05-09 21:16 被阅读0次

    awk简介

    awk在unix时候已经出现了。在linux上跑的,很多都是gun版的awk,简称gawk,以下简称awk
    awk提供的不是编辑器命令,而是提供了一种编程语言,能够像其他编程语言一样,定义变量保存数据,使用算术和字符串操作符、逻辑判断、数组、循环等各种编程语言中所有可以使用的功能

    awk的基本语法格式

    awk [OPTION] 'program' FILE
    'program'组成:pattern{action STATEMENTS}
    

    action statements可以由多句语句组成,个语句之间使用;号隔开,理解awk的语法组成尤为重要。

    awk的处理过程

    awk在处理文本时,也是一次读取一行文本,然后根据输入分隔符(默认空格)进行切片,切成n片后,然后将每片都赋予awk内部的一个变量当中来进行保存。这些变量分别用$1、$2...一直到分片的最后一个,awk能对这些分片单独处理。如输出显示、运算、计数等。

    awk常见选项

    -F fs:指明字段分隔符;
    -v var=value:自定义变量;
    -f programfile:从文件中读取program命令;

    awk常用的action

    1.print()
    其使用格式类似于print item1,item2,...,使用逗号作为分隔符,输出的item可以为字符串,也可以为数值,也可以为当前记录的字段、变量或表达式等。如果省略了item,则相当于print $0打印所有行。
    2.printf()
    printf命令常用于格式化输出awk命令的执行结果信息。其格式类似于printf FORMAT,item1,item2...,其中必须指定FORMAT格式;如需换行,需手动添加\n换行符;在FORMAT中需要分别为后面的每个item指定一个格式符。
    其对应的格式符有:

    %c: 显示字符的ASCII码;
    %d, %i: 显示十进制整数;
    %e, %E: 科学计数法数值显示;
    %f:显示为浮点数;
    %g, %G:以科学计数法或浮点形式显示数值;
    %s:显示字符串;
    %u:无符号整数;
    %%: 显示%自身

    awk的program语句

    program部分由两pattern{action STATEMENTS} 组成,其中,pattern表示awk要匹配的行,后面的{}则表示对这些行作如何处理。
    parrent格式

    1. empty:空模式,默认就是空模式,表示处理所有行。
      例如:awk -F:'{print($1,$7)}' /etc/passwd表示以:为分割,打印每行的$1和$7分片的内容

    2. /regular expression/:表示只处理被expression所匹配到的行,匹配不上的不会被处理。
      例如awk -F: '/\/bin\/bash$/{print($1)}' /etc/passwd,表示在处理前,匹配结尾是否为/bin/bash,如果是,则套用在{}输出显示。

    3. /PATTERN1/,/PATTERN2/:表示仅处理从第一个被pattern1匹配到行,到第一个被pattern2所匹配的行之间的所有行.

    4. relational expression: 关系表达式;结果有“真”有“假”;结果为“真”才会被处理;
      例如:awk -F: '$3%2==0{print $1,$3}' /etc/passwd,表示如果UID为偶数,则显示用户名和ID

    1. line range:注意,不支持直接给出行范围,但可以通过内置NR变量来取行范围。
      例如:awk -F: 'NR>=1&&NR<=10{print $1,$3}' /etc/passwd
      只对1到10行作处理。
    1. BEGIN{}:表示对文本处理前,应先执行的语句

    2. END{}:对文本处理完成后,会执行END{}语句.

    awk变量

    1.内建变量
    awk在内部有内建的变量,常用变量如下。

    FS:输入字段分隔符,默认为空白字符;
    OFS:输出字段分隔符,默认为空白字符;
    RS:输入时的换行符;
    ORS:输出时的换行符;
    NF:每行的字段数,$NF表示最后一个字段;
    NR:表示行数;
    FNR:若提供多个文件,则分别计算各文件的行数;
    FILENAME:当前文件名;
    ARGC:命令行参数的个数;
    ARGV:参数数组,保存的是命令行给定的各参数;

    2.自建变量
    变量可以使用选项-v来指明。
    例如:awk -v admin=123 'BEGIN{print admin}'
    也可以在program中自定义变量。
    例如: awk 'BEGIN{test=123;print(test)}'
    注意,引用变量不需要加$号,$号是用做代表分片变量。

    awk的条件表达式

    action

    )Expressions: 算术,比较表达式等
    ) Control statements :if, while等
    ) Compound statements :组合语句
    ) input statements
    ) output statements :print等

    ** Control statements(控制语句)
    控制语句 ,注意看格式
    if(condition) {statments}
    if(condition) {statments} else {statements}
    while(conditon) {statments}
    do {statements} while(condition)
    for(expr1;expr2;expr3) {statements}
    break
    continue
    delete array[index]
    delete array
    exit
    { statements }

    无论如何,注意语法格式,

    1. if-else
      语法:if(condition) {statments} else {statements}
      例:判断UID,少于500,判断为系统用户,大于1000,普通用户
      [root@test ~]# awk -F: '{if ($3<500) {print ("systemUser",$1,$3)} else {print("comm user",$1,$3)}}' /etc/passwd

    2.if-else if 多重分支
    语法:if(condition) {statments} else if(condition) {statements}
    例:判断UID,等于0,显示管理员,大于0少于500,显示系统用户,其余显示为普通用户
    [root@test1 ~]# awk -F : '{if ($3 == 0) {print ($1,"adminuser")} else if ($3 >= 1 && $3 < 500) {print ($1,"sysuser")} else {print ($1,"commuser")}}' /etc/passwd

    3.while循环
    条件为真,则进入循环,直到条件为假退出
    使用场景:对一行内的多个字段逐一类似处理时使用;对数组中的各元素逐一处理时使用
    语法:while(conditon) {statments}
    例子:对/etc/grub.conf的非#号开头的行的其他行,计算其每个单词的长度
    [root@test1 ~]# awk '!/^#/{i=1;while(i<=NF) {print ($i,length($i));i++}}' /etc/grub.conf

    4.do-while循环
    语法:do statement while(condition)
    意义:至少执行一次循环体

    5.for循环
    语法:for(expr1;expr2;expr3) statement
    for(variable assignment;condition;iteration process) {for-body}
    例子:对/etc/grub.conf的非#号开头的行的其他行,计算其每个单词的长度
    [root@test1 ~]# awk '{for(i=1;i<=NF;i++) print ($i,length($i))}' /etc/grub.conf

    相关文章

      网友评论

          本文标题:awk

          本文链接:https://www.haomeiwen.com/subject/kzzdrftx.html