欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

gawk编程

发布时间:2023/12/20 83 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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: 19

for 语句

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

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

总结

以上是生活随笔为你收集整理的gawk编程的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。