前言
awk是一种很棒的语言,它适合文本处理和报表生成。
其语法比较常见,借鉴了某些语言的一些精华,比如C语言等。
在Linux系统日常处理工作中,发挥很重要的作用,掌握了awk将会使你的工作变得高大上。
1. awk实战讲解
1.1 awk的原理
通过一个简单的命令,我们来了解其工作原理。
awk '{print $0}' /etc/passwd echo hhh|awk '{print "hello,world"}' awk '{print "hiya"}' /etc/passwd
输出:
[root@oldboy /]# awk '{print $0}' /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin ... stu06:x:831:831::/home/stu06:/bin/bash stu07:x:832:832::/home/stu07:/bin/bash stu08:x:833:833::/home/stu08:/bin/bash stu09:x:834:834::/home/stu09:/bin/bash stu10:x:835:835::/home/stu10:/bin/bash [root@oldboy /]# echo hhh|awk '{print "hello,world"}' hello,world [root@oldboy /]# awk '{print "hiya"}' /etc/passwd hiya hiya ... hiya hiya hiya hiya hiya # 行数和/etc/passwd的行数相等
通过上面的示例,解释awk做了些什么:
- 调用awk时,我们指定/etc/passwd作为输入文件。
- 执行awk时,它依次对/etc/passwd中的每一行执行print命令。
- 所有输出都发送到stdout,所得到的结果与执行cat /etc/passwd完全相同。
现在,解释{print} 代码块:
- 在awk中,花括号{} 将几块代码组合到一起,这一点类似C语言。
- 在代码块中只有一条print命令。在awk中,如果只出现print命令,那么将打印当前行的全部内容。
再次说明,awk对输入文件中的每一行都执行这个脚本:
1.2 BEGIN和END模块
通常,对于每个输入行,awk都会执行每个脚本代码块一次。
然而,在许多变成情况中,可能需要在awk开始处理文件的文本之前执行初始化代码。
对于这种情况,awk允许定义一个BEGIN块。
awk在开始处理输入文件之前会执行BEGIN块,因此,它是初始化FS(字段分隔符)变量、打印页眉或初始化其它在程序中以后会使用的全局变量的极佳位置。
awk还提供了另一个特殊块,叫做END块。
awk在处理了输入文件中的所有行之后执行END块。
通常,END块用于执行最终计算或打印应该出现在输出流结尾的摘要信息。