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脚本中的命令。这是在处理完所有正常数据后给报告添加页脚的最佳方法。

文本三剑客---gawk基础的更多相关文章

  1. 文本三剑客---sed 基础

    sed编辑器被称作流编辑器(stream editor),和普通的交互式文本编辑器恰好相反.在交互式文本编辑器中(比如vim),你可以用键盘命令来交互式的插入.删除或者替换数据中的文本.流编辑器则会自 ...

  2. Linux文本三剑客超详细教程---grep、sed、awk

    awk.grep.sed是linux操作文本的三大利器,合称文本三剑客,也是必须掌握的linux命令之一.三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂.grep更适合单 ...

  3. 6.文本三剑客之sed

    文本三剑客之sed 目录 文本三剑客之sed sed编辑器 sed概述 sed工作流程 sed用法 sed打印 sed删除 sed替换 sed增加行内容 sed剪切粘贴与复制粘贴 sed字符/字符串交 ...

  4. 文本三剑客---awk(gawk)基础

    gawk程序是Unix中原始awk程序的GNU版本.gawk程序让流编辑器迈上了一个新的台阶,它提供了一种编程语言而不只是编辑器命令.在gawk编程语言中,可以完成下面的事情: (1)定义变量来保存数 ...

  5. linux基础—课堂随笔05_文本三剑客之SED

    1.简介 sed是非交互式的编辑器,它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件(或输入),并将结果发送到屏幕.具体过程如下 ...

  6. 文本三剑客之grep的用法

    第1章         正则表达式 1.1    正则表达式的介绍               正则是用来过滤文件内容               为处理大量文本|字符串而定义的一套规则和方法.    ...

  7. Linux文本三剑客总结

    Linux文本处理三剑客 grep 文本过滤(模式:pattern)工具 grep, egrep, fgrep(不支持正则表达式搜索) grep  grep: Global search REgula ...

  8. Linux:Day17(上) gawk基础

    GNU awk: 文本处理三工具:grep,sed,awk grep,egrep,fgrep:文本过滤工具:pattern sed:行编辑器 模式空间.保持空间 awk:报告生成器,格式化文本输出: ...

  9. 文本三剑客之sed

    sed是一个流编辑器(sed是stream editor的缩写),它可以对从标准输入流中得到的数据进行处理,然后把处理以后得到的结果输出到标准输出,而标准输出通常会关联到终端屏幕,因此处理后的结果也会 ...

随机推荐

  1. NOSQL基础概念

    NoSql是一个很老的概念了,但对自己来说,仍然是一个短板,果断补上. 首先通过几个简单的例子来了解NOSQL在国内的情况(2013年左右的数据,有些过时),比如新浪微博,其就有200多台物理机运行着 ...

  2. backbone中get和fetch的区别

    我也是刚开始接触backbone.js对于里面的很多东西都看过,但是具体在使用起来还是有很多问题,其中一个就是get和fetch的区别,这个让我很纠结,都是获取模型的数据,干嘛要有两个呢?最近好像弄明 ...

  3. hibernate配置三步走

    1.导入有hibernate的required和jpa的jar包,数据库驱动jar包,日志jar包 2.创建实体类,必须有一个属性有唯一的值 package com.hui.hibernate; pu ...

  4. js数组及数组应用(冒泡和二分,遍历输出)

    一.定义:1)var arr=new Array(); 加数据:arr[0]=1; 2)定义同时赋值:var arr=new Array(1,2,3,4,5); 3)调用:var arr=new Ar ...

  5. Bash内置命令

    Bash有很多内置命令,因为这些命令是内置的,因此bash不需要在磁盘上为它们定位,执行速度更快. 1)列出所有内置命令列表$enable 2)关闭内置命令test$enable -n test 3) ...

  6. 通过PHP前端后台交互/通过ajax前端后台交互/php基础传输数据应用/简单的留言版/简单的注册账户/简单的登录页/

      前  言  PHP     通过上一篇博客,注册账号与登录页面--前后台数据交互  跳转转到index主页,接下来进入主页留言板功能,通过ajax向后台传输数据,同时发表留言. 具体的内容分析如下 ...

  7. 不再迷惑,无值和NULL值的转换

    在关系型数据库的世界中,无值和NULL值的区别是什么?一直被这个问题困扰着,甚至在写TSQL脚本时,心有戚戚焉,害怕因为自己的一知半解,挖了坑,贻害后来人,于是,本着上下求索,不达通幽不罢休的决心(开 ...

  8. Jenkin-持续集成

    1.Jenkins安装 本文将会介绍如何在windows 中安装Jenkins,并且使用Jenkins进行项目的构建. 首先我们进入到Jenkins 的官网下载地址:https://jenkins.i ...

  9. Discuz搜索改为指向帖子

    安装的版本是DiscuzX2.5,搜索的时候发现默认指向的是门户里的文章搜索,但程序都没有安装门户,只有论坛,所以不能搜索文章. 在网上找了半天终于找到修改的办法了. <input name=& ...

  10. MVC之前-ASP.NET初始化流程分析1

    Asp.net Mvc是当前使用比较多的web框架,也是比较先进的框架.我打算根据自己的实际项目经验以及相关的源码和一些使用Asp.net Mvc的优秀项目(主要是orchard)来说一说自己对于As ...