zoukankan      html  css  js  c++  java
  • Linux常用命令awk

    AWK是一种优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人阿尔佛雷德·艾侯、彼得·温伯格和布莱恩·柯林汉姓氏的首个字母)的最大功能取决于一个人所拥有的知识。AWK提供了极其强大的功能:可以进行正则表达式的匹配,样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。实际上AWK的确拥有自己的语言:AWK程序设计语言,三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。gawk是AWK的GNU版本。

    最简单地说,AWK是一种用于处理文本的编程语言工具。AWK在很多方面类似于Unix shell编程语言,尽管AWK具有完全属于其本身的语法。它的设计思想来源于SNOBOL4、sed、Marc Rochkind设计的有效性语言、语言工具yacc和lex,当然还从C语言中获取了一些优秀的思想。在最初创造AWK时,其目的是用于文本处理,并且这种语言的基础是,只要在输入数据中有模式匹配,就执行一系列指令。该实用工具扫描文件中的每一行,查找与命令行中所给定内容相匹配的模式。如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,则继续处理下一行。

    以上是引用wiki对awk的描述。可以看出awk是一项文本处理工具,具有自己的awk的程序语言。由三位设计者:阿尔佛雷德·艾侯、彼得·温伯格、布莱恩·柯林汉共同设计。

    AWK是一种处理文本文件的语言。它将文件作为记录序列处理。在一般情况下,文件内容的每行都是一个记录。每行内容都会被分割成一系列的域,因此,我们可以认为一行的第一个词为第一个域,第二个词为第二个,以此类推。AWK程序是由一些处理特定模式的语句块构成的。AWK一次可以读取一个输入行。对每个输入行,AWK解释器会判断它是否符合程序中出现的各个模式,并执行符合的模式所对应的动作。

    ——阿尔佛雷德·艾侯,The A-Z of Programming Languages: AWK

    一.基本语法

    awk [options] 'pattern{action}' file

    1. 其中pattern表示AWK在数据中查找的内容,而action是在找到匹配内容时所执行的一系列命令。输入行被分成了一些记录:记录默认由换行符分割,因此输入会按照行进行分割。程序使用给定的条件一个个的测试每条记录,并执行测试通过的条件所对应的action。pattern和action都可以省略不写。无pattern默认匹配全部的记录;而无action则是打印原始记录。简单的AWK表达式之外,pattern可以是BEGIN或END;这两种条件对应的action分别是读取所有的记录之前和之后。同时,如pattern1, pattern2的条件表示符合条件pattern1和pattern2的记录及其之间的部分。

    2. action表示对pattern匹配的内容的处理逻辑

    二.命令

    awk命令即为前文例子中以action指代的语句。AWK命令可以包括函数调用,变量赋值,计算,及/或各项的组合。标准AWK提供了许多内建函数;其部分实现则可能提供了更多的内建函数。同时,AWK的部分实现支持动态链接库,使得其可以支持更多的函数。

    如:
    print命令:用于输出文本内容。其输出的文本总是以"输出记录分隔符"(Output record separator, ORS)分割的,其默认值为换行符。

    在AWK中,记录会被分割成“域”,它们可以被分别显示或使用:
    print $0: 显示当前记录的第1个域
    print $1, $3显示当前记录的第1和第3个域,并以预定义的输出域分隔符(Output field separator, OFS)分隔,其默认值为一个空格符

    三.内建变量

    awk的内建变量包括域变量,例如$1, $2, $3,以及$0。这些变量给出了记录中域的内容。 内建变量也包括一些其他变量:

    • NR:已输入记录的条数。
    • NF:当前记录中域的个数。记录中最后一个域可以以$NF的方式引用。
    • FILENAME:当前输入文件的文件名。
    • FS:“域分隔符”,用于将输入记录分割成域。其默认值为“空白字符”,即空格和制表符。FS可以替换为其它字符,从而改变域分隔符。
    • RS:当前的“记录分隔符”。默认状态下,输入的每行都被作为一个记录,因此默认记录分隔符是换行符。
    • OFS:“输出域分隔符”,即分隔print命令的参数的符号。其默认值为空格。
    • ORS:“输出记录分隔符”,即每个print命令之间的符号。其默认值为换行符。
    • OFMT:“输出数字格式”(Format for numeric output),其默认值为"%.6g"。

    参数

    awk -F fs -v var=value 'pattern{action}' file

    • -F:用于定义每行内容的域分隔符,默认是空格符,如果fs是空,则每个字符都被分成一个域;

    • -v:在pattern{action}执行前被赋值,常用用于指定变量

    echo | awk -v a=100 '{print a}'
    
    

    样例

    1.示例1:

    awk '{print}' ods_out_ext_xxx_auth_list_dd_20180803.txt
    
    

    执行结果:

    000181241  000
    000184  00
    00018232121 23
    00018241 33
    0001812321
    
    

    2.示例2:

    awk '{print 3+2}' ods_out_ext_xxx_auth_list_dd_20180803.txt
    
    

    执行结果:

    5
    5
    5
    5
    5
    
    

    3.示例3:

    awk '{print NR}' ods_out_ext_xxx_auth_list_dd_20180803.txt
    
    

    执行结果:

    1
    2
    3
    4
    5
    
    
  • 相关阅读:
    JavaScript的数据类型
    伪元素和伪类的区别是什么?
    伪元素::before和::after的详细介绍
    Ksoap2 获取webservice返回值的getResponse() 出现的问题
    解决dropdownlist postback 在 iphone UIwebview 失效的问题
    javascript雪花效果 注释版
    金山词霸每日一句开放平台 .NET demo
    【摘抄】Application.StartupPath和System.Environment.CurrentDirectory的区别
    EditText 监听回车事件 避免2次触发
    【代码】ini 文件读取工具类
  • 原文地址:https://www.cnblogs.com/lxyit/p/9417948.html
Copyright © 2011-2022 走看看