gawk编程
概念
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 脚本不太一样,比如 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 * 5print 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=1total=0while (i <= 5) {total += $ii++}print totalavg=total/5print "Average: ", avg } # gawk -f test.gawk data.txt 95 Average: 19for 语句
for 和 C 语言中的语法也是一样,下面直接以一个例子说明即可:
# cat for_test.gawk {total=0for (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一旦定义了函数,你就能在程序的代码中随意使用。在设计很大的代码量时,这会省去很多的工作。
总结
- 上一篇: 10 分钟了解 Flutter 跨平台方
- 下一篇: wordpress企业网站模板