# gawk

gawk程序的报告生成能力通常用来从大文本文件中提取数据元素,并将它们格式化成可读的 报告。其中最完美的例子是格式化日志文件。在日志文件中找出错误行会很难,gawk程序可以让 你从日志文件中过滤出需要的数据元素,然后你可以将其格式化,使得重要的数据更易于阅读。

# gawk命令格式

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

# 从命令行读取程序脚本

gawk程序脚本用一对花括号来定义。你必须将脚本命令放到两个花括号({})中。如果你 错误地使用了圆括号来包含gawk脚本,就会得到一条类似于下面的错误提示。

gawk '{print "Hello World!"}'

data.txt

The quick,brown fox jumps over the lazy dog. 
The quick,brown fox jumps over the lazy dog. 
The quick,brown fox jumps over the lazy dog. 
The quick,brown fox jumps over the lazy dog.
1
2
3
4
  • gawk '{print $1,$9}' data.txt 默认空格分割
  • gawk -F, '{print $1,$9}' data.txt 使用,分割
  • gawk '{$4="Christine"; print $0}' data.txt 使用多个脚本
  • gawk -f script2.gawk data.txt

script3.gawk

text = "'s home directory is " 
print $1 text $6 
1
2
  • gawk -F: -f script3.gawk /etc/passwd

# 在处理数据前运行脚本

BEGIN关键字,它会强制gawk在读取数据前执行BEGIN关键字后指定的程序脚本。

  • gawk 'BEGIN {print "Hello World!"}'
  • gawk 'BEGIN {print "The data3 File Contents:"} {print $0}' data.txt
  • gawk 'BEGIN {print "The data3 File Contents:"} {print $0} END {print "End of File"}' data.txt
  • gawk -f ./script.gawk data.txt script.gawk
BEGIN { 
    print "The latest list of users and shells" 
    print " UserID \t Shell" 
    print "-------- \t -------" 
    FS="," 
} 
{ 
    print $1 " \t " $2 
} 
END { 
    print "This concludes the listing" 
}
1
2
3
4
5
6
7
8
9
10
11
12

# ⚠️注意事项

DANGER

  • 按下Ctrl+D组合键来表明数据结束
  • gawk程序在引用变量值时并未像shell脚本一样使用美元符。