一、基本介绍
相较于sed编辑器来说,gawk提供了一种编程语言,而不仅仅是编辑器命令。
在gawk编程语言中,可以实现以下操作:
- 定义变量来保存数据;
- 使用算术和字符串运算符来处理数据;
- 使用结构化编程语法(如:if-then语句和循环)为数据处理添加处理的逻辑;
- 提取文件中的数据将其重新排列组合,最后生成格式化报告。
gawk的报告生成能力多用于从大文本文件中提取数据并将其格式化为可读性报告,最完美的应用案例就是格式化日志文件,gawk能从日志文件中过滤出所需的数据,并将其格式化,以便于阅读。
格式:
gawk options program file
-F fs | 指定行中划分数据字段的字段分隔符 |
-f file | 从指定文件中读取gawk脚本代码 |
-v var=value | 定义gawk脚本中的变量及其默认值 |
-L [keyword] | 指定gawk的兼容模式或警告级别 |
1、从命令行中读取gawk脚本
gawk脚本用一对花括号定义,必须将脚本命令放到一对花括号({})之间。由于gawk命令行假定脚本是单个文本字符串,所以还必须将脚本放到单引号中。
gawk '{print "hello world"}'
由于没有在命令行中指定文件名,所以gawk程序会从STDIN接收数据,在上面的脚本运行时,它就会一直等待来自STDIN的文本。
用户需要输入一行文本并按Enter键,这样gawk才会对这行文本执行一遍脚本。由于此脚本设为显示一行固定的字符串,因此不管在数据流中输入什么文本,都会得到同样的输出。如下所示:
要终止这个gawk程序,就必须表明数据量已经结束。bash shell提供了Ctrl+D组合键来生成EOF(end-of-file)字符,通过使用它便可以终止gawk程序并返回到命令行界面。
2、使用数据字段变量
gawk编辑器在处理文本文件中的数据时,会自动为每一行的各个数据元素分配一个变量。
默认情况下,gawk会将下列变量分配给文本行中的数据字段。
$0:代表整个文本行;
$1:代表文本行中的第一个数据字段;
$2:代表文本行中的第二个数据字段;
$n:代表文本行中的第n个数据字段
文本行中的数据字段是通过字段分隔符划分的。在读取一行文本时,gawk会用预先定义好的字段分隔符划分出各个数据字段。默认情况下,字段分隔符是任意的空白字符(如,空格,制表符)
# 显示第一个数据字段
gawk '{print $1}' test.txt
使用 -F 选项指定其它的字段分隔符:-F,
# 用中文逗号作为字段分隔符
gawk -F, '{print $1}' test.txt
3、在gawk脚本中使用多条命令
在shell脚本中使用多条命令,只需在命令之间加分号即可。
# $4将第4个字段赋值成Wen,然后打印出整条语句
echo "My name is Ning" | gawk '{$4="Wen"; print $0}'
也可以使用次提示符一次一行地输入脚本命令。因为没有在命令行中指定文件名或文本,所以,gawk程序会从STDIN中获取数据,当运行它的时候,它就会等着读取来自STDIN输入的文本。如果要退出的话,只需同时按下Crtl+D组合键表明数据已结束即可。
4、从文件中读取脚本
和sed编辑器一样,可以将gawk脚本放入文件中,然后在命令行中引用脚本。
可以在脚本中写上多条命令,一行写一条,不需要分号。
text的赋值不能使用单引号;在gawk中,引用变量无须像在shell脚本中的那样使用没有符号。
5、在处理数据前运行gawk脚本
有时候,需要在处理数据前就运行gawk脚本,比如为报告创建一个标题。这时,需要用到BEGIN关键字,它会强制gawk在读取数据前执行BEGIN关键字之后指定的脚本。
gawk 'BEGIN {print "城市名:"};{print $0}' test.txt
6、在处理数据后运行gawk脚本
END关键字允许指定一段脚本,在处理完数据后执行。可以用于给报告添加页脚。
7、小型gawk脚本文件
创建一个gawk脚本文件。
BEGIN {
print "*****最新的用户和Shell清单*****"
print "用户ID \t Shell"
print "------- \t -------"
FS=":"
}{
print $1 " \t " $7
}END {
print "*****已总结完毕*****"
}
gawk -f lnn.gawk /etc/passwd | more