如何使用gawk命令

gawk程序是Unix原awk程序的GUN版本,awk程序在流编辑方面比sed编辑器更先进的是:他提供了一种编程语言而不仅仅是编辑器命令行,在编程语言内部,可以:

1.定义要保存数据的变量

2.使用算术和字符串操作符对数据进行运算

3.使用结构化编程概念,将逻辑添加到数据处理过程

4.通过从数据文件内抽取数据元素以及按照其他顺序或格式对他们重定位,生成带格式的报告

gawk程序的报告生成能力常用于从大文本中抽取数据元素,并将其格式化为易读的报告,这方面的一个完美示例是格式化日志文件,试图浏览日志文件中的错误行可能很难,gawk程序允许我们从日志文件中筛选要查看的数据元素,然后用一种更便于阅读主要数据的方式格式化数据

gawk命令格式

基本格式

gawk options program file

gawk选项

-F fs 指定描绘一行中数据字段的文件分隔符

-f file 指定读取程序的文件名

-v var=value 定义gawk程序中使用的变量和默认值

-mf N 指定数据文件中要处理的字段的最大数目

-mr N 指定数据文件中的最大记录大小

-W keyword 指定gawk的兼容模式或警告级别

自命令行读取程序脚本

gawk程序由脚本由左大括号和右大括号定义,脚本命令必须放置在两个大括号之间,由于gawk命令行假定脚本是单文本字符串,所以必须将脚本包括在单引号内,下面是在命令行上指定的一个简单的gawk程序脚本

[root@mio-test ~]# gawk '{print "dddddd"}'
dsfsdf
dddddd

运行脚本程序时,他只能等待STDIN输入的文本,然后读取输入,执行print ‘ddddd’

结束gawk程序

要结束gawk程序,必须信号说明数据流已经结束,bash提供了生成 End-of-File(EOF)字符的组合键(CTRL+D)

使用数据字段变量

如前所述,gawk的主要功能之一是其处理文本文件中数据的能力,他通过自动将变量分配给每行中的每个数据元素实现这一功能,默认情况下,gawk将下面的变量分配给在文本行中检测到的每个数据字段

$0 表示整行文本

$1 表示文本行中的第一个数据字段

$2 表示文本行中的第二个数据字段

$n 表示文本行中的第n个数据字段

各数据字段依据文本行中的字段分隔符确定,gawk读取一行文本时,使用定义的字段分隔符描述各数据字段,gawk的默认字段分隔符是任意空白字符(如制表符或空格符)

gawk读取example.txt的文本并显示第一个数据字段

[root@mio-tt ~]# gawk '{print $1}' example.txt 
aaa
fff
eee

-F 指定字段分隔符

[root@mio-tt ~]# gawk -F: '{print $1}' /etc/shadow
root
bin
daemon
adm
lp

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

如果只能执行一个命令,这样的编程语言不是特别有用,gawk编程语言允许你将命令组合成普通程序,要在命令行指定的程序脚本中使用多个命令,只需要在各命令之间加一个分号

[root@mio-test ~]# echo 'aaa bbb ccc ddd' | gawk '{$2="yyy";print $0}'
aaa yyy ccc ddd
[root@mio-test ~]#

从文件读取程序

和sed编辑器一样,gawk编辑器允许你将程序保存在文件中并在命令行引用他们

[root@mio-test ~]# vi gawk.1 
{ print $1 "user id =" $3}

[root@mio-test ~]# gawk -F: -f gawk.1 /etc/passwd
rootuser id =0
binuser id =1
daemonuser id =2
admuser id =3

在处理数据之前运行脚本

gawk程序还允许指定运行脚本的时机,默认情况下,gawk从输入读取一行文本,然后执行程序脚本处理文本行的数据,但有时,可能需要在处理数据之前,执行BEGIN关键字之后指定的脚本

[root@mio-test ~]# gawk 'BEGIN {print "aaaa"} {print $0}'
aaaa
fdsf
fdsf

在处理之后运行脚本

与BEGIN关键词类似,END关键字允许在读取数据之后gawk执行的程序脚本

[root@mio-test ~]# gawk 'BEGIN {print "aaaa"} {print $0} END {print "end input"}'
aaaa
ggg
ggg
end input