我们知道 Linux 三剑客,它们分别是:grep
、sed
、awk
。在前边已经讲过 grep 和 sed,没看过的同学可以直接点击阅读,今天要分享的是更为强大的 awk
。
sed
可以实现非交互式的字符串替换,grep
能够实现有效的过滤功能。与两者相比,awk
是一款强大的文本分析工具,在对数据分析并生成报告时,显得尤为强悍。
awk 强大的功能,是一般 Linux 命令无法比拟的。在本文中,我不会告诉你 awk 也是一种编程语言,免得会吓到你。我们只需把它当做 Linux 下一款强大的文本分析工具即可。
这篇文章,我仍然秉持着 实用、实践 原则,提供大量的示例,但不会面面俱到。通过本文可以帮助你,快速将 awk 运用起来,这些东西足够应付工作中大多数应用场景。
场景
学习具体使用前,先来看下 awk 能干些什么事情:
1. 能够将给定的文本内容,按照我们期望的格式输出显示,打印成报表。
2. 分析处理系统日志,快速地分析挖掘我们关心的数据,并生成统计信息;
3. 方便地用来统计数据,比如网站的访问量,访问的 IP 量等;
4. 通过各种工具的组合,快速地汇总分析系统的运行信息,让你对系统的运行了如指掌;
5. 强大的脚本语言表达能力,支持循环、条件、数组等语法,助你分析更加复杂的数据;
…
当然 awk 不仅能做这些事情,当你将它的用法融汇贯通时,可以随心所欲的按照你的意愿,来进行高效的数据分析和统计。
不过我们需要知道,awk 不是万能的,它比较擅长处理格式化的文本,比如 日志、csv 格式数据等;
原理
我们先来简单了解 awk 基本工作原理,通过下边的图文讲述,希望你能了解 awk 到底是如何工作的。
awk 基本命令格式
awk 'BEGIN{cmds} pattern{cmds} END{cmds}'
结合下图来详细说明 awk 工作原理
- 首先,执行关键字
BEGIN
标识的{}
中的命令; - 完成
BEGIN
大括号中命令的后,开始执行body
命令; - 逐行读取数据,默认读到
\n
分割的内容为一条 记录,其实就是行的概念; - 将记录按照指定的分隔符划分为 字段,其实就是列的概念;
- 循环执行
body
块中的命令,每读取一行,执行一次body
,最终完成body
执行; - 最后,执行
END
命令,通常会在END
中输出最后的结果;
awk 是输入驱动的,有多少输入行,就会执行多少次 body
命令。
我们在下边的示例学习中,要时刻记着:记录 (Record) 就是行,字段 (Field) 就是列,BEGIN
是预处理阶段,body
是 awk 真正工作的阶段,END
是最后处理阶段。
实战 - 入门
从下边内容开始,我们直接进入到实战。为了方便举例,我先把如下信息保存到 file.txt
-rw-r--r-- 1 root 52457 Aug 10 2019 ngx_http.c
-rw-r--r-- 1 mary 7099 Dec 12 2019 ngx_http_cache.h
-rw-r--r-- 1 mary 2565 Aug 10 2019 ngx_http_config.h
-rw-r--r-- 1 root 140333 Aug 13 2019 ngx_http_core_module.c
-rw-r--r-- 1 dave 5946 De