awk

一,awk介绍

  1. awk:报告生成器,格式化文本输出

  2. 基本用法

    a. awk程序通常由 BEGIN语句块,模式匹配的通用语句块,END语句块,这三部分组成

    b. 选项

             -F:指明输入时用到的字段分隔符

             -v :指定变量

二,awk语言

  1. 分隔符,域和记录

    a. awk执行时,有分隔符分隔的字段为域,标记为$1,$2...$n

        $0为所有域          和shell中变量$含义不同

    b. 文件的每一行为记录

    c. 不指定域,默认执行print $0

    print1.png

三,awk工作原理

  1. 执行顺序

    a. 执行BEGIN语句块

    b. 逐行扫描文件,执行模式匹配语句块,从第一行到最后一行

    c. 执行END语句块

    这三个语句块都是可选语句块

  2. print格式

    print item1,item2,..

    a. 逗号为分隔符

    b. 输出的item可以是字符串,数值,当前记录的字段,变量或者awk的表达式

    c. 省略item,相当于print $0

    print2.png

四,awk变量

  1. 内置变量

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

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

    变量1.png

    RS:输入时的换行符,原换行符仍有效

    变量2.png

    ORS:输出时用指定的符号代替原换行符

    变量3.png

    NF:字段数量

    变量4.png

    NR:行号

    FNR:分别显示每个文件的行号

    变量5.png

    FILENAME:当前的文件名

    ARGC:命令行参数的个数,本身算第一个参数

    ARGV:数组,AGRV[下标数],AGRV[0]是awk

    变量6.png

  2. 自定义变量

    a. -v var=value

    b. 可以在模式语句块中直接定义

    自定义变量.png

    自定义变量1.png

五,printf命令

  1. 格式化输出

    a. 必须指定格式符

    b. 不自动换行,需要给出换行控制符,\n

    c. 需要分别给每个item指定格式符

  2. 格式符

    %d:显示十进制整数

    %f:显示为浮点数

    %s:显示字符串

    %u:显示无符号整数

    %%:显示%本身

    printf.png

  3. 修饰符

    #[.#]:第一个#控制显示的宽度,第二个#表示小数点后精确度

    -:左对齐

    +:显示数值的正负符号

    print3.png

  4. 操作符

    a. 逻辑操作符

             && , || , !

             条件表达式

                 ?if-true:if-false

    操作符1.png

    b. 算数操作符

             +,-,*,/,%,^

             -x:转换为负数

             +x:转换为数值

    c. 赋值操作符

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

             ++,--

    d. 比较操作符

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

    e. 模式匹配符

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

             !~:是否不匹配

    操作符.png

六,模式匹配

  1. 未指定,匹配每一行

  2. / /,仅处理能模式匹配到的行

  3. 关系表达式,结果为真进行处理

  4. / /,/ /,行范围,不支持直接给出数字格式

  5. BEGIN/END模式

    BEGIN{}:仅在开始处理文件中的文本之前执行一次

    END{}:仅在文本处理完成之后执行一次

    beginend.png


    看几个例子,更好的理解有关变量真假的情况seq.png

    seq1.png

    seq2.png



七,awk控制语句

  1. if( ){ }else if( ){ }        else if 要打全,跟脚本里的不一样

    if.png

  2. while(){}

    条件为真进入循环,为假退出循环

    对一行内的多个字段逐一类似处理时可使用

    对数组中的各元素逐一处理时可使用

    while.png

  3. do{}while()

    无论真假,先执行一次循环体

  4. for(){}

    for(变量 in 数组){}:遍历数组中的元素

    for.png

  5. next

    提前结束对本行处理而直接进入下一行处理(awk自身循环)

    next.png

八,awk数组

  1. 可使用任意字符串,字符串要使用双引号括起来

  2. 如果某数组元素事先不存在,引用时,awk会自动创建元素

    数组.png

九,awk函数

  1. 数值处理

    srand() [种子,没有rand无法执行] rand():返回0和1之间一个随机数

    int():取整数

    hs.png

  2. 字符串处理

    length([s]):指定字符串的长度

    sub(r,s,[t]):r是被替换的内容,s是替换的内容,t是字符串(可选),只替换匹配到的第一个内容

    gsub(r,s,[t]):r是被替换的内容,s是替换的内容,t是字符串(可选),替换所有匹配到的内容

    split(s,array,[r]):s是字符串,r是分隔符,用来分隔s,array是数组,元素为分隔后的字符串

    函数.png

    函数1.png

  3. 自定义函数

    函数名( ){

    ...

    }

十,awk脚本

  1. 将awk程序写成脚本,直接调用或执行

  2. 在awk中调用shell命令,需用system

    空格分隔,除了awk的变量其他都用""引用起来

    脚本.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章