awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理,本篇文章重点为大家讲解一下awk具体使用方法。
学习具体使用前,先来看下 awk 能干些什么事情:
当然 awk 不仅能做这些事情,当你将它的用法融汇贯通时,可以随心所欲的按照你的意愿,来进行高效的数据分析和统计。
不过我们需要知道,awk 不是万能的,它比较擅长处理格式化的文本,比如 日志、csv 格式数据等;
我们先来简单了解 awk 基本工作原理,通过下边的图文讲述,希望你能了解 awk 到底是如何工作的。
awk 基本命令格式
Awk 实战详解教程Awk 实战详解教程
结合下图来详细说明 awk 工作原理
Awk 实战详解教程Awk 实战详解教程
awk 是输入驱动的,有多少输入行,就会执行多少次 body 命令。
我们在下边的示例学习中,要时刻记着:记录 (Record) 就是行,字段 (Field) 就是列,BEGIN 是预处理阶段,body 是 awk 真正工作的阶段,END 是最后处理阶段。
从下边内容开始,我们直接进入到实战。为了方便举例,我先把如下信息保存到 file.txt
Awk 实战详解教程Awk 实战详解教程
好了,我们先来一个最简单最常用的 awk 示例,输出第 1、4、8 列:
Awk 实战详解教程Awk 实战详解教程
大括号里边的就是 awk 语句,只能被单引号包含,其中,N表示第几列,$0 表示整个行内容
再来看下 awk 比较实用的功能 格式化输出。和 C 语言的 printf 格式输出是一毛一样,我个人特别喜欢这种格式化方式,而不是 C++ 中的流的方式。
Awk 实战详解教程Awk 实战详解教程
%s 表示字符串占位符,-4表示列宽度为 4,且左对齐,我们还可以根据需要,列出更复杂的格式来,这里先不详细举例了。
(一)过滤记录
有些数据可能不是你想要的,可以根据需要进行过滤
Awk 实战详解教程Awk 实战详解教程
上边的过滤条件为,第 3 列为 root 且第 6 列为 10 的行,才会被输出。
awk 支持各种比较运算符号 !=、>、=、(二)内置变量
awk 内置了一些变量,更方便我们对数据的处理
Awk 实战详解教程Awk 实战详解教程
过滤第 3 列为 root 用户,以及第 2 行内容,且打印时输出行号。NR 表示当前第几行,NF表示当前行有几列。
(三)指定分隔符
我们的数据,不总是以空格为分隔符,我们可以通过 FS 变量指定分隔符。
Awk 实战详解教程Awk 实战详解教程
我们指定分隔符为 2019,这样就将行内容分割为了两部分,将 2019 替换成了 *
上边的命令也可以通过 -F 选项指定分割符
Awk 实战详解教程Awk 实战详解教程
如果你需要指定多个分隔符,可以这样做 -F ‘[;:]’。相信聪明的你,一定能够理解并融会贯通的。
同样,awk 可以指定输出时的分隔符,通过 OFS 变量来设置
Awk 实战详解教程Awk 实战详解教程
输出时,各字段用 OFS 指定的符号进行了分隔。
(一)条件匹配
列出 root 用户的所有文件,以及第一行文件
Awk 实战详解教程Awk 实战详解教程
上边匹配第三列中包含 root 的行,~ 其实就是正则表达式的匹配。
同样,awk 可以像 grep 一样匹配某一行,就像这样
Awk 实战详解教程Awk 实战详解教程
另外,可以这样 /Aug|Dec/ 匹配多个关键词。
模式取反可以使用 ! 符号
Awk 实战详解教程Awk 实战详解教程
(二)拆分文件
我们来做一件有意思的事情,可以将文本信息拆分为多个文件,下边命令按照月份(第5列)将文件信息拆分为多个文件
Awk 实战详解教程Awk 实战详解教程
awk 支持重定向符号 >,直接将每行内容重定向到月份命名的文件了,当然你也可以把指定的列输出到文件
(三)if 语句
复杂的条件判断,可以使用 awk 的 if 语句,awk 的强大正因为它是个脚本解释器,拥有一般脚本语言的编程能力,下边示例通过稍微复杂的条件进行拆分文件
Awk 实战详解教程Awk 实战详解教程
要注意,if 语句是在大括号里边的。
(四)统计
统计当前目录下,所有 .c、.h 文件所占用空间大小总和
Awk 实战详解教程Awk 实战详解教程
第 5 列表示文件大小,每读取一行就会将该文件大小计算到 sum 变量中,在最后 END 阶段打印出 sum,也就是所有文件的大小总和。
再来看一个例子,统计每个用户的进程占用了多少内存,注意取值的是 RSS 那一列
Awk 实战详解教程Awk 实战详解教程
这里用到了 数组 和 for 循环,值得一提的是,awk 的数组可以理解为字典或 Map,key 可以是数值和字符串,这种数据类型在平时很常用。
(五)字符串
通过下边简单示例,展示 awk 对字符串操作的支持
awk 内置支持一系列的字符串函数,length 计算字符串长度,toupper 函数转换字符串为大写。
为了从整体上理解 awk 工作机制,我们再来看一个综合的示例,假设有一个学生成绩单:
Awk 实战详解教程Awk 实战详解教程
由于此示例程序稍显复杂,在命令行上不易读,另外呢,也想通过此案例介绍另外一种 awk 的执行方式,我们的 awk 脚本如下:
Awk 实战详解教程Awk 实战详解教程
执行 awk 结果如下
Awk 实战详解教程Awk 实战详解教程
我们可以将复杂的 awk 语句写入脚本文件 cal.awk,然后通过 -f 选项指定从脚本文件执行。
这个简单示例,完整的体现了 awk 的工作机制和原理,希望通过此示例能够帮你真正理解 awk 是如何工作的。
通过上述的示例,我们学习到了 awk 的工作原理,下边我们来总结下几个概念和常用的知识点。
(一)内置变量
\1. 每一行内容记录,叫做记录,英文名称 Record
\2. 每行中通过分隔符隔开的每一列,叫做字段,英文名称 Field
明确这几个概念后,我们来总结几个重要的内置变量:
NR:表示当前的行数;
NF:表示当前的列数;
RS:行分隔符,默认是换行;
FS:列分隔符,默认是空格和制表符;
OFS:输出列分隔符,用于打印时分割字段,默认为空格
ORS:输出行分隔符,用于打印时分割记录,默认为换行符
(二)输出格式
awk 提供 printf 函数进行格式化输出功能,具体的使用方式和 C 语法基本一致。
基本用法
Awk 实战详解教程Awk 实战详解教程
常用的格式化方式:
%d 十进制有符号整数
%u 十进制无符号整数
%f 浮点数
%s 字符串
%c 单个字符
%e 指数形式的浮点数
%x %X 无符号以十六进制表示的整数
%0 无符号以八进制表示的整数
%g 自动选择合适的表示法
\n 换行符
\t Tab符
(三)编程语句
awk 不仅是一个 Linux 命令行工具,它其实是一门脚本语言,支持程序设计语言所有的控制结构,它支持:
条件语句
循环语句
数组
函数
(四)常用函数
awk 内置了大量的有用函数功能,也支持自定义函数,允许你编写自己的函数来扩展内置函数。
这里只简单罗列一些比较常用的字符串函数:
index(s, t) 返回子串 t 在 s 中的位置
length(s) 返回字符串 s 的长度
split(s, a, sep) 分割字符串,并将分割后的各字段存放在数组 a 中
substr(s, p, n) 根据参数,返回子串
tolower(s) 将字符串转换为小写
toupper(s) 将字符串转换为大写
这里只简单总结一些常用的字符串功能函数,具体使用方法,还需要你参照前边的示例程序,举一反三,运用到实际问题中。
文章题目:详解awk具体使用方法
标题路径:http://www.shufengxianlan.com/qtweb/news25/388575.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联