Linux 三剑客之 Awk

Awk是一种很棒的语言,它适合文本处理和报表生成,其语法较为常见,借鉴了其他语言的精华部分,如 C 语言等。在 Linux 系统日常处理工作中,发挥很重要的作用,掌握了Awk将会使你的工作变的高大上。Awk是三剑客的老大,利剑出鞘,必定不同凡响。

1.1 Awk 实践

1.1.1 awk的原理

通过一个简短的命令来初步了解其工作原理。现在,解释下 awk 做了些什么。调用 awk 时,我们指定 /etc/passwd 作为输入文件。执行 awk 时,它依次对 /etc/passwd 中的每一行执行 print 命令。所有输出都发送到stdout,所得到的的结果与执行 cat /etc/passwd 完全相同。

再解释下{print}代码块。在 awk 中,花括号用于将几块代码组合到一起,这一点类似于 C 语言。在代码块中只有一条 print 命令。在 awk 中,如果只出现 print 命令,那么将打印当前行的全部内容。

再次说明,awk 对输入文件中的每一行都执行这个脚本。

1.1.2 BEGIN 和 END 模块

通常,对于每个输入行,awk 都会执行每个脚本代码块一次。然而,在许多编程情况中,可能需要在 awk 开始处理输入文件中的文本之前执行初始化代码。对于这种情况,awk 允许您定义一个 BEGIN 块。由于 awk 在开始处理输入文件之前会执行 BEGIN 块,故其为初始化 FS(字段分隔符)变量、打印页眉或初始化其它在程序中以后会引用的全局变量的极佳位置。

awk还提供了另一个特殊块,叫作 END 块。awk 在处理了输入文件中的所有行之后执行这个块。通常,END 块用于执行最终计算或打印应该出现在输出流结尾的摘要信息。

1.1.3 运算符

  • awk 赋值运算符

  • awk 逻辑运算符

  • awk 正则运算符

  • awk 关系运算符

如 > < 可以作为字符串比较,也可以用作数值比较,关键看操作数如果是字符串就会转换为字符串比较。两个都为数字才转为数值比较。字符串比较:按照 ASCII 码顺序比较。

  • awk 算术运算符

说明:所有用作算术运算符进行操作,操作数自动转为数值,所有非数值都变为0.

  • awk 其他运算符

1.1.4 常用 awk 内置变量

注:内置变量还有很多,具体详情请参阅相关资料

  • 字段分隔符 FS

FS=”\t” 一个或多个 Tab 分隔

FS=”[[:space:]+]” 一个或多个空白空格,默认的

FS=”[” “:]+” 以一个或多个空格或:分隔

  • 字段数量 NF

  • RS 记录分隔符变量

将 FS 设置成 “\n” 告诉 awk 每个字段都占据一行。通过将 RS 设置成””,还会告诉awk 每个地址记录都由空白行分隔。

  • OFS 输出字段分隔符

  • ORS 输出记录分隔符

1.1.5 awk 正则

 正则的相关概念可参考 正则表达式简述 

  • 规则表达式

awk ‘/REG/{action}’ file, /REG/为正则表达式,可以将 $0 中满足条件的记录送入到 action 进行处理

  • 布尔表达式

awk ‘布尔表达式{action}’ file 仅当对前面的布尔表达式求值为真时,awk 才执行代码块。

1.2 Awk 的 if、循环和数组

1.2.1 条件语句

awk 提供了非常好的类似于 C 语言的 if 语句。

1.2.2 循环结构

awk 的 while 循环结构等同于相应的 C 语言 while 循环。awk 还有”do … while”循环,它在代码块结尾处对条件求值,而不像标准 while 循环那样在开始处求值。“do … while”循环永远都至少执行一次。

awk 允许创建 for 循环,它就像 while 循环,也等同于 C 语言的 for 循环。

此外,如同 C 语言一样,awk 提供了 break 和 continue 语句。使用这些语句可以更好地控制 awk 的循环结构。

1.2.3 数组

  • 数组

AWK 中的数组都是关联数组,数字索引也会转变为字符串索引。for … in 输出,由于数组是关联数组,默认是无序的,故通过 for … in 得到的是无序的数组。如果需要得到有序数组,需要通过下标获得。

  • 用 awk 中查看服务器连接状态并汇总

1.3 常用字符串函数

1.3.1 awk常用函数表

awk常用字符串函数有很多,具体函数及其说明请参考相关文档,相关应用文中后续会提到。

1.3.2 字符串函数的应用

替换

在 info 中查找满足正则表达式,/[0-9]+/ 用“!”替换,并且替换后的值,赋值给 info,未给 info 值,默认是 $0

查找

找到,返回 ok;未找到,返回 0

匹配查找

如果查找到数字则匹配成功返回 ok,否则失败,返回未找到

截取

从第 4 个字符开始,截取 10 个长度字符串

分割

发表评论

电子邮件地址不会被公开。 必填项已用*标注