gawk程序是Unix中的原始awk程序的GNU版本,它能提供一个类编程环境来修改和重新组织文件,完成诸如从文本文件中提取数据、生成报告等任务。
在gawk中我们可以做下面的事情:
- 定义变量来保存数据;
- 使用算术和字符串操作符来处理数据;
- 使用结构化编程概念(比如if-then语句和循环)来为数据处理增加处理逻辑;
- 通过提取数据文件中的数据元素,将其重新排列或格式化,生成格式化报告;
gawk命令格式
gawk <options> <program file>
gawk options 选项:
- -F fs:指定行中划分数据字段的字段分隔符
- -f file:从指定的文件中读取程序
- -v var=value:定义gawk程序中的一个变量及其默认值
- -mf N:指定要处理的数据文件中的最大字段数
- -mr N:指定数据文件中的最大数据行数
- -W keyword:指定gawk的兼容模式或警告等级
从命令行读取脚本
gawk '{print "Hello World!"}'
This is a test
Hello World!
hello
上面的命令行程序并没有指定文件名,所以gawk程序会从STDIN接收数据,它会等待从STDIN输入之后才会执行print,输入完毕后gawk程序会等待EOF(ctrl+D)字符终止程序的执行
使用数据字段变量
可以使用-F选项来指定分隔符将一个文本行分隔成若干数据字段(默认空格)
- $0代表整个文本行;
- $1代表文本行中的第1个数据字段;
- $2代表文本行中的第2个数据字段;
- $n代表文本行中的第n个数据字段;
- $NF代表文本行中的最后一个数据字段
打印"/etc/passwd"文件中的第1个字段,即用户名
gawk -F: '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
在脚本程序中使用多个命令
在gawk编程中,允许将多个命令组成一个功能更多的程序,只需要在每个命令后面添加分号(;)即可。
echo "My name is Rich" | gawk '{$4="Christine"; print $0}'
My name is Christine
也可以用次提示符一次一行地输入程序脚本命令。
gawk '{
> $4="Christine"
> print $0}'
My name is Rich
My name is Christine
在文件中读取程序
使用-f选项指定程序文件,程序文件中包含了需要执行的gawk程序代码
cat script2.gawk
{print $1 "'s home directory is " $6}
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
在处理数据前后运行脚本
使用关键字'BEGIN'在处理数据前运行脚本
gawk 'BEGIN {print "The data3 File Contents:"}
> {print $0}' data3.txt
The data3 File Contents:
Line 1
Line 2
Line 3
使用关键字'END'在处理数据前运行脚本
gawk 'BEGIN {print "The data3 File Contents:"}
> {print $0}
> END {print "End of File"}' data3.txt
The data3 File Contents:
Line 1
Line 2
Line 3
End of File