zoukankan      html  css  js  c++  java
  • 文本三剑客---awk(gawk)基础

    gawk程序是Unix中原始awk程序的GNU版本。gawk程序让流编辑器迈上了一个新的台阶,它提供了一种编程语言而不只是编辑器命令。在gawk编程语言中,可以完成下面的事情:
    (1)定义变量来保存数据;
    (2)使用算数和字符串操作符来处理数据;
    (3)使用结构化编程概念(比如if-then语句和循环)来为数据处理增加处理逻辑;
    (4)通过提取数据文件中的数据元素,将其重新排列或格式化,生成格式化报表;
    gawk程序的报告生成能力通常用来从大文本文件中提取数据元素,并将它们格式化成可读的报告。其中完美的例子是格式化日志文件。在日志文件中找出错误行会很难,gawk程序可以让你从日志文件中过滤出需要的数据元素,然后你可以将其格式化,使得重要的数据易于阅读。

    1 gawk命令格式

    gawk option program file
    	选项:		描述
    	-F fs			指定行中划分数据字段的字段分隔符
    	-f file			从指定的文件中读取程序
    	-v var=value		定义gawk程序中的一个变量及其默认值
    	-mf N			指定要处理的数据文件中的最大字段数
    	-mr N			指定数据文件中的最大数据行数
    	-W  keyword		指定gawk的兼容模式或警告等级
    

    命令行选项提供了一个简单的途径来定制gawk程序中的功能。
    gawk的强大之处在于程序脚本,可以写脚本来读取文本行的数据,然后处理并显示数据,创建任何类型的输出报告。

    2 从命令行读取程序脚本

    (1)gawk程序及脚本用一对花括号来定义。你必须将命令放到两个花括号“{}”中。如果你错误的使用了圆括号来包含gawk脚本,就会出错。
    (2)由于gawk命令行假定脚本是单个文本字符串,你还必须将脚本放到单引号中。
    例如:

            [root@centos7 ~]# gawk '{print "Hello World!"}'
    

    运行这个命令,你可能会有些失望,因为什么都不会发生。原因在于没有在命令行上指定文件名,所有gawk程序会从STDIN接受数据。在运行这个程序时,它会一直等待从STDIN输入的文本。
    如果你输入一行文本并按下回车键,gawk会对这行文本运行一遍程序脚本。跟sed编辑器一样,gawk程序会针对数据流中的每一行文本执行程序。由于程序脚本被设为显示一行固定的文本字符串,因此不管你在数据流中输入什么文本,都会得到同样的文本输出。

    [root@centos7 ~]# gawk '{print "Hello World!"}'
    Thie is a error test
    Hello World!
    Hello World!
    Hello World!
    

    要终止这个程序,你必须标明数据流已经结束了。bash shell提供了一个组合键俩生成EOF(End –of-File)字符。Ctrl + D 组合键会字bash中产生一个EOF字符。这个组合键能够终止该gawk程序并返回到命令行界面提示符下。

    3 使用数据字段变量

    gawk的主要特征之一是其处理文本文件中数据的能力。它会自动给一行的每个数据元素分配一个变量。默认情况下,gawk会将如下变量分配给它在文本中发现的数据字段:

    $0	代表整个文本行
    $1	代表文本行的第一个数据段
    $n	代表文本行的第n个数据段
    

    在文本行中,每个数据段都是通过字段分隔符划分的。gawk在读取一行文本时,会用预定义的字段分隔符划分每个字段。gawk中默认的字段分隔符是任意的空白字符(例如空格或者制表符)。
    例如,用-F指定字段分隔符。显示系统密码文件的第一个数据字段。由于/etc/passwd用冒号来分隔数据字段,因而可以将冒号指定为字段分隔符。

    [root@centos7 ~]# gawk -F : '{print $1}' /etc/passwd
    root
    bin
    daemon
    adm
    lp
    sync
    shutdown
    halt
    mail
    operator
    [……]
    

    4 在程序脚本中使用多个命令

    gawk编程语言允许将多条命令组合成一个正常程序。要在命令行上的程序脚本中使用多条命令,只要在命令之间放个分号即可。
    例如

    [root@centos7 ~]# echo "My name is centos"|gawk '{$4="hahaha";print $0}'
    My name is hahaha
    

    第一条命令会给$4赋值。第二条命令会打印整个数据字段。注意,gawk程序在输出中已经将原文本中的第四个数据字段替换了新值。

    5 从文本中读取程序

    跟sed编辑器一样,gawk编辑器允许将程序存储到文件中,然后再在命令行中引用。

    [root@centos7 ~]# cat script2.gawk 
    {print $1 "'s' home directory is " $6}
    [root@centos7 ~]# gawk -F: -f script2.gawk  /etc/passwd
    root's' home directory is /root
    bin's' home directory is /bin
    daemon's' home directory is /sbin
    adm's' home directory is /var/adm
    lp's' home directory is /var/spool/lpd
    sync's' home directory is /sbin
    shutdown's' home directory is /sbin
    halt's' home directory is /sbin
    mail's' home directory is /var/spool/mail
    [……]
    

    script2.gawk程序脚本会再次使用print命令打印/etc/passwd文件中的主目录数据字段(字段变量$6),以及userID数据字段(字段变量$1)。
    可以在程序文件中指定多条命令。要这么做的话,只有一天命令放一行即可,不需要使用分号。

    [root@centos7 ~]# cat script3.gawk 
    {
    text = "'s home directory is "
    print $1 text $6
    }
    
    [root@centos7 ~]# gawk -F: -f script3.gawk /etc/passwd
    root's home directory is /root
    bin's home directory is /bin
    daemon's home directory is /sbin
    adm's home directory is /var/adm
    lp's home directory is /var/spool/lpd
    sync's home directory is /sbin
    shutdown's home directory is /sbin
    [……]
    

    script3.gawk程序脚本定义了一个变量来保存print命令中用到的文本字符串。
    注意:gawk程序在引用变量值时并未像shell脚本一样使用美元符。

    6 在处理数据前运行脚本

    gawk还允许指定程序脚本何时运行。默认情况下,gawk会从输入中读取一行文本,然后针对该行的数据执行程序脚本。有时可能会需要在处理数据前运行脚本,比如报告创建标题。BEGIN关键字就是用来做这个的。它会强制gawk在读取数据前执行BEGIN关键字后指定的程序脚本。

    [root@centos7 ~]# cat data3.txt 
    Line 1
    Line 2
    Line 3
    [root@centos7 ~]# gawk 'BEGIN{print "The data3 File contents:"}{print $0}' data3.txt The data3 File contents:
    Line 1
    Line 2
    Line 3
    

    在gawk执行了BEGIN脚本后,它会用第二段脚本来处理文件数据。这么做是要小心,两段脚本仍然被认为是gawk命令行中的一个文本字符串。你需要相应的加上单引号。

    7 在处理数据后运行脚本

    与BEGIN关键字类似,END关键字允许你指定一个程序脚本,gawk会在读完数据后执行它。

    [root@centos7 ~]# gawk '{print $0} END{print "End of file"}' data3.txt 
    Line 1
    Line 2
    Line 3
    End of file
    

    当gawk程序打印完文件内容后,会执行END脚本中的命令。这是在处理完所有正常数据后给报告添加页脚的最佳方法。

  • 相关阅读:
    我的Java学习推荐书目
    BTrace使用简介
    BTrace使用小结
    如何在生产环境使用Btrace进行调试
    BTrace : Java 线上问题排查神器
    淘宝Tprofiler工具实现分析
    JVM 性能调优实战之:使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码
    性能工具TProfiler介绍文档
    分布式系统理论基础
    微信小程序
  • 原文地址:https://www.cnblogs.com/Sunzz/p/7232058.html
Copyright © 2011-2022 走看看