awk是一个使用非常广泛的文本处理工具,是功能最强大的数据处理引擎之一,可以进行样式的装入,流控制,数学运算符,进程控制语句甚至于内置变量和函数。
grep 更适合单纯的查找或匹配文本
sed 更适合编辑匹配到的文本,对列处理的功能要差一些
awk 更适合格式化文本,对文本进行较复杂格式处理,功能复杂,对列处理的功能比较强大
awk命令格式
格式1: 前置命令 | awk 【选项】‘【条件】{编辑指令}’
格式2: awk 【选项】‘【条件】{编辑指令}’ 文件....
部分 AWK 的典型应用场景
AWK 可以做非常多的工作。 下面只是其中的一小部分:
文本处理,
生成格式化的文本报告,
进行算术运算,
字符串操作,以及其它更多。
AWK 基本示例
本章节中,我们将用几个示例来讲解几个有用的 AWK 命令。 假设我们经有一个文件文件 marks.txt 等待处理,它所包含的内容如下:
1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89
打印列或域
我们可以使用 AWK 命令仅输出输入文件中某些特定的列的内容。示例如下:
[jerry]$ awk '{print $3 "\t" $4}' marks.txt
执行上面的命令可以得到如下结果:
Physics 80
Maths 90
Biology 87
English 85
History 89
在 marks.txt 文件中,第三列包含课程名字,第四列包含在该课程的得分。我们使用 AWK 输出命令只输出了这两列的内容。上面例子中,$3与$4代表输入记录中的第三列与第四列的内容。
输出所有行
默认情况下,如果某行与模式串匹配,AWK 会将整行输出:
[jerry]$ awk '/a/ {print $0}' marks.txt
执行上面的命令可以得到如下结果:
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89
上面的示例中,我们搜索模式串 a,每次成功匹配后都会执行主体块中的命令。如果没有主体块——默认的动作是输出记录(行)。因此上面的效果也可以使用下面简略方式实现,它们会得到相同的结果:
[jerry]$ awk '/a/' marks.txt
通过匹配模式串输出列
前面我们已经看到了,当模式串匹配成功后, AWK 默认会输出整个记录。不过,我们可以让 AWK 只输出特定的域(列)的内容。 例如,下面的这个例子中当模式串匹配成功后只会输出第三列与第四列的内容:
[jerry]$ awk '/a/ {print $3 "\t" $4}' marks.txt
执行上面的命令可以得到如下结果:
Maths 90
Biology 87
English 85
History 89
以任意顺序输出列
我们能以任意顺序输出各列吗?当然可以! 下面的例子中我们将在第四列后输出第三列的内容:
[jerry]$ awk '/a/ {print $4 "\t" $3}' marks.txt
执行上面的命令可以得到如下结果:
90 Maths
87 Biology
85 English
89 History
计数匹配次数并输出
让我们尝试一个更有意思的例子,在这个例子中我们会统计模式串成功匹配的次数,并将该结果打印出来:
[jerry]$ awk '/a/{++cnt} END {print "Count = ", cnt}' marks.txt
执行上面的命令可以得到如下结果:
Count = 4
上面这个例子中,每次成功的匹配我们都会增加计数器的值,并在结束块中将该计数器的值输出。 请注意,与其它编程语言不一样的地方在于, AWK 在使用一个变量前不需要特意地声明这个变量。
输出字符数多于 18 的行
这个例子中我们只输出那些字符数超过 18 的记录:
[jerry]$ awk 'length($0) > 18' marks.txt
执行上面的命令可以得到如下结果:
3) Shyam Biology 87
4) Kedar English 85
AWK 提供了内置的 length 函数。该函数返回字符串的长度。变量 $0 表示整行,缺失的主体块会执行默认动作,例如,打印输出。 因此,如果一行中字符数超过 18, 则比较的结果为真,该行则被输出。
更多分享请访问博客 海马搜索 www.hmsou.com