# 简介

gawk 程序是 Unix 中原始 gawk 程序的 GNU 版本,让流编辑迈上了一个新的台阶,其作用为:

  • 定义变量保存数据。
  • 使用算数和字符串操作符处理数据。
  • 使用结构化编程概念来为数据处理增加处理逻辑。
  • 通过提取数据文件中的数据元素,将其重新排列或格式化,生成格式化报告

格式: gawk options program file

gawk 强大之处在于程序脚本,可以写脚本来读取文本行的数据,处理并显示数据,创建任何类型的输出报告。

如果你没有下载 gwak ,执行命令: sudo apt install gawk

# 从命令行读取脚本程序

gawk 程序脚本用一对花括号定义 {} , 必须将脚本命令放在花括号中:

gawk '{print "Hello World"}'

print 命令会将文本打印到 STDOUT 中,由于没有在命令行中指定文件,所以输入默认是接收 STDIN 。由于该命令固定显示 Hello World ,所以不论输入什么,都只会显示这个。希望结束程序,必须表明数据流已经结束, ctrl+d 会产生一个 EOF 字符,能够终止 gawk

gawk '{print "Hello world"}' testfile   
# 使用文件作为输入
# 由于 gawk 命令行假定脚本是个单个文本字符串,所以要使用 ''

如果要使用多命令,还是使用分号

echo "this is rich" | gawk '{$4="Mike";print $0}'
 
 # 也可以分行
     gawk '{
  > $3='123'
  > print $0
  > }'

这个与 sed 的多命令相似,两者的格式区别在于, sed 的命令直接使用 ''gawk 使用 '{}' ,如果将命令放在文件中,两者是相同的,都是使用 -f 参数,文件名为了避免混淆,也会以. gawk 后缀命名。在 gawk 命令文件中,可以定义变量,同时,使用时不需要 $

text='213'
print text

# 数据字段变量

gawk 会给一行中每个数据元素分配一个变量(默认数据分隔符是空格) $0 -- 整行数据 $n -- 第 n 个数据

gawk -F: '{print $1}' data

打印 data 每行第一个数据, -F 指定分隔符,以 : 为分隔符。

# 程序脚本的运行

gawk 允许指定程序脚本何时运行,默认情况下, gawk 会从输入读取一行脚本,然后针对该行数据运行程序脚本,但是,有时需要在处理数据前运行脚本,有时在之后处理脚本。

  • BEGIN 关键字:会强制 gawk 在读取数据前执行 BEIGIN 关键字后指定的程序脚本
cyan@cyan-virtual-machine:~/Templates$ gawk 'BEGIN {print "hello"}'
hello
cyan@cyan-virtual-machine:~/Templates$ 
# 因为没有其他处理数据的命令,直接退出

print 显示完文本后会快速退出,不等待任何数据,如果想使用正常的程序脚本中处理数据,必须使用另一个脚本区域来定义程序:

cyan@cyan-virtual-machine:~/Templates$ gawk 'BEGIN {print "hello"}
> {print $1}
> ' data
hello
cat
cat
cat
cat
cat
  • END 关键字:会在读取数据 (是所有数据) 处理完之后,执行 END 后面的程序脚本
cyan@cyan-virtual-machine:~/Templates$ gawk 'BEGIN {print "The data file content:"}
> {print $1}
> END {print "END of file"}' data
The data file content:
cat
cat
cat
cat
cat
END of file