当前位置: 首页 > 工具软件 > Gawk > 使用案例 >

gawk编程

上官季
2023-12-01

概念

awk 程序是一个用于从大文本中提取数据元素的工具,可以看做是单独的一门编程语言,而不属于 shell 脚本。

主要就是用来在大的数据中提取中自己需要的元素(对文本数据的每行进行处理),然后将其格式化,使得重要的数据更易于阅读。

对于日志以及 CSV 那样的每行格式相同的文本文件, awk 可能是最方便的工具。

gawk 就是 Unix 下的原始 awk 程序的 GNU 版本。

安装gawk

Ubuntu 中使用 apt 包管理工具安装(一般都是需要自己手动的安装,所有的发行版中都没有默认安装 gawk 包):

# apt install gawk -y

体验第一次gawk程序

直接在 Linux 终端下输入 gawk 即可运行 gawk 脚本。也称为在命令行中直接运行脚本,而不是从程序脚本中读取很多条语句。这和 shell 一样,在命令行中可以输入一条或多条语句进行执行,也可以从 .sh 脚本中运行多个脚本命令。

gawk `{printf("HelloWorld!")}`
  • 加 单引号 的原因:因为使用了 gawk 命令, 而 gawk 命令行假定后面的内容是单个字符串。而且 gawk 脚本必须放在 {} 中,无论是 BEGIN 块还是 END 块。都应该在 {}

字段变量

因为 gawk 对文件来说是一行一行的进行处理,所以读取的默认是一行数据 $0,而每一行又分为很多的段,也就是一句话中有很多的单词,或者是一行有很多的数据(默认使用的是空格和换行作为字段分隔符)

默认是使用空格或者是换行作为字段之间的分隔符,如果你想使用其他的字段作为分隔符,使用 FS 参数,而且指定输出字段分隔符使用 OFS 命令。

从文件中读取脚本

从文件中读取脚本进行运行,这应该是经常使用的,这里我们在运行时候需要加上参数 -f 用来指定具体的脚本文件:

$ cat test.gawk
{
	testing="This is a test script for gawk"
	print testing
}
# gawk -f test.gawk 
(输入回车。因为如果不指定要读取的文件的话,它默认是从stdin进行读取,所以我们需要输入点什么东西)
This is a test script for gawk

结构化命令

gawk 程序和 c 语言的程序特别相像,但是和 shell 脚本不太一样,比如 ifwhile 语句,shell 都是 if-then-else-fiwhile-do-done 结构,但是 gawkc 一样,没有 thenfi 都能等关键字,直接使用大括号将脚本括起来即可。下面详解:

if语句

if (condition) {
	statement
}

例子:

# cat data.txt
10 23 9 32 11
# cat test.gawk
{
	if ($1>5) {
		print $1
	} else {
		x=$1 * 5
		print x
	}
}
# gawk -f test.gawk data.txt
10 # 因为$1 = 10 > 5,所以输出 $1 = 10,很简单

while 语句

while (condition) {
	statement
}

例子:

# cat data.txt
10 23 9 32 11
# cat test.gawk
{
	i=1
	total=0
	while (i <= 5) {
		total += $i
		i++
	}
	print total
	avg=total/5
	print "Average: ", avg
}
# gawk -f test.gawk data.txt
95
Average: 19

for 语句

forC 语言中的语法也是一样,下面直接以一个例子说明即可:

# cat for_test.gawk
{
	total=0
	for (i=1; i<4;++i) {
		total += $i
	}
	print "Total: " total
}

# cat data.txt
1 21 4 5
# gawk -f for_test.gawk data.txt
Total: 31

函数

内建函数(系统函数)

数学函数

  • cos
  • sin
  • sqrt
  • log
  • int
  • srand

按位运算:

and(v1, v2)or(v1, v2)xor(v1, v2)lshift(v, shift)rshift(v, shift)

字符串函数

时间函数

  • strftime():将当前的时间戳转化格式化日期 (采用 shell 函数 date() 的格式)
  • systime() : 返回当前时间的时间戳

下面是在 gawk 中使用时间函数的例子:

$ gawk `BEGIN{
date=system()
day=strftime("%A, %B, %d, %Y", date)
print day
}`

自定义函数

除了 gawk 中的内建函数外,还可以在 gawk 程序中创建自定义函数。

回顾: shell 函数定义

# 方式一:
function fun_name {
	
}
# 方式二:
fun_name() {

}

但是在 awk 中函数定义和 C 中定义函数差不多,多了关键字 function:

function name([variable]) {
	function body
}

简单的例子:

# 脚本文件
# cat function_test.gawk
{
	function printLine() {
		print $0
	}
}
# 文本文件
#cat data.txt
this is the first line
this is the second line
this is the third line
# 执行脚本
# gawk -f function_test.gawk data.txt
this is the first line
this is the second line
this is the third line

注意: 函数体的大括号不要和 gawk 本身的大括号混淆。各算各的。

函数调用:

调用函数直接使用函数名就可以,还要有函数调用运算符(如果函数有形参的话还要给出实参),但是在 shell 脚本中就只需要函数名,不需要括号。

而且函数的定义要放在所有的代码块之前(包括BEGIN 代码块)。

例子:

# cat fun_test.gawk

一旦定义了函数,你就能在程序的代码中随意使用。在设计很大的代码量时,这会省去很多的工作。

 类似资料: