# 简介
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 |