awk
程序是一个用于从大文本中提取数据元素的工具,可以看做是单独的一门编程语言,而不属于 shell
脚本。
主要就是用来在大的数据中提取中自己需要的元素(对文本数据的每行进行处理),然后将其格式化,使得重要的数据更易于阅读。
对于日志以及 CSV
那样的每行格式相同的文本文件, awk
可能是最方便的工具。
gawk
就是 Unix
下的原始 awk
程序的 GNU
版本。
在 Ubuntu
中使用 apt
包管理工具安装(一般都是需要自己手动的安装,所有的发行版中都没有默认安装 gawk
包):
# apt install gawk -y
直接在 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
脚本不太一样,比如 if
、while
语句,shell
都是 if-then-else-fi
和 while-do-done
结构,但是 gawk
和c
一样,没有 then
、fi
都能等关键字,直接使用大括号将脚本括起来即可。下面详解:
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
语句for
和 C
语言中的语法也是一样,下面直接以一个例子说明即可:
# 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
一旦定义了函数,你就能在程序的代码中随意使用。在设计很大的代码量时,这会省去很多的工作。