码迷,mamicode.com
首页 > 其他好文 > 详细

awk

时间:2018-04-11 11:33:04      阅读:133      评论:0      收藏:0      [点我收藏+]

标签: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

    技术分享图片

三,awk工作原理

  1. 执行顺序

    a. 执行BEGIN语句块

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

    c. 执行END语句块

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

  2. print格式

    print item1,item2,..

    a. 逗号为分隔符

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

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

    技术分享图片

四,awk变量

  1. 内置变量

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

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

    技术分享图片

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

    技术分享图片

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

    技术分享图片

    NF:字段数量

    技术分享图片

    NR:行号

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

    技术分享图片

    FILENAME:当前的文件名

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

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

    技术分享图片

  2. 自定义变量

    a. -v var=value

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

    技术分享图片

    技术分享图片

五,printf命令

  1. 格式化输出

    a. 必须指定格式符

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

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

  2. 格式符

    %d:显示十进制整数

    %f:显示为浮点数

    %s:显示字符串

    %u:显示无符号整数

    %%:显示%本身

    技术分享图片

  3. 修饰符

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

    -:左对齐

    +:显示数值的正负符号

    技术分享图片

  4. 操作符

    a. 逻辑操作符

             && , || , !

             条件表达式

                 ?if-true:if-false

    技术分享图片

    b. 算数操作符

             +,-,*,/,%,^

             -x:转换为负数

             +x:转换为数值

    c. 赋值操作符

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

             ++,--

    d. 比较操作符

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

    e. 模式匹配符

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

             !~:是否不匹配

    技术分享图片

六,模式匹配

  1. 未指定,匹配每一行

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

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

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

  5. BEGIN/END模式

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

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

    技术分享图片


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

    技术分享图片

    技术分享图片

    技术分享图片



七,awk控制语句

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

    技术分享图片

  2. while(){}

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

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

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

    技术分享图片

  3. do{}while()

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

  4. for(){}

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

    技术分享图片

  5. next

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

    技术分享图片

八,awk数组

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

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

    技术分享图片

九,awk函数

  1. 数值处理

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

    int():取整数

    技术分享图片

  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是数组,元素为分隔后的字符串

    技术分享图片

    技术分享图片

  3. 自定义函数

    函数名( ){

    ...

    }

十,awk脚本

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

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

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

    技术分享图片

awk

标签:awk

原文地址:http://blog.51cto.com/13572810/2096806

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!