linux文本分析利器awk

news/2024/7/5 4:04:35

转 快速理解linux文本分析利器awk

原文链接 杜亦舒 性能与架构 

awk是什么


如果工作中需要操作linux比较多,那么awk是非常值得学习的


awk是一个极其强大的文本分析工具,把文件逐行的读入,以指定分隔符将每行切片,切开的部分再进行各种分析处理


可以使用awk创建程序,来读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有很多其他的功能


awk使用示例


通过一些简单的示例来认识一下awk


(1) ll | awk '{print $9}' 


这个命令的结果是只显示文件名列表


工作过程


awk命令接收 ll 结果信息,并逐行处理

对每一行结果记录按空格(空格是默认分隔符)分割,并打印出第9列的信息


语法说明


单引号('')里面的部分是awk要执行的内容,花括号({})中是一个代码块,单引号中可以有多个花括号部分


print是一个输出命令


$9 表示分割结果中的第9列内容,分割结果相当于一个数组,从 0-n,$0 是没分割的整行内容,$n 是分割后的第 n 列内容


(2)awk -F ':' '{print $1"\t"$6}' /etc/passwd


上个命令是通过管道处理命令结果


这个命令是处理文件(/etc/passwd)的内容,显示出用户名、用户目录列表


passwd文件中每行内容是用 ':' 分隔的,要使用 -F 参数来指定分隔符


awk命令的尾部跟上文件名,就表示要处理这个文件


$1"\t"$6 是组织结果信息显示形式,第1列内容 + tab + 第6列内容


(3)awk -F: '/root/{print $0}' /etc/passwd


上两个命令是处理每一行记录,如果想过滤出自己关注的记录,可以使用匹配模式


这个命令就是对每行进行匹配,如果这一行信息中含有 root,才执行后面{}中的命令


双斜杠(/.../)中支持正则表达式,例如匹配以 root 开头的行


awk -F: '/^root/{print $0}' /etc/passwd


(4)awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd


awk还内置了一些有用的变量,例如这个命令中打印出了


‘文件名’ - FILENAME

‘行号’ - NR

‘列号’ - NF


(5)awk -F ':' 'BEGIN {print "header"} {print $1} END {print "foot"}' /etc/passwd


这个命令中多了两个新部分:


BEGIN {print "header"}

END {print "foot"}


BEGIN 是开始处理前的动作,END 是处理后的动作


工作流程


1)先执行BEGING


对应此例中的 BEGIN {print "header"}


2)读取文件,取得第一行进行分割,然后执行动作,对应此例中的 {print $1},直至处理完每一行


3)执行END操作


对应此例中的 END {print "foot"}


(6)ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print size/1024/1024,"M"}'


此命令统计文件夹下的文件总大小,以M为单位


此例中新增了一个概念:变量


在起始部分 BEGIN {size=0;} 中,定义了一个变量,名为 size,初始化为 0


在每行对应的处理动作为 {size=size+$5;},对size变量值进行累加


在结束部分 END{print size/1024/1024,"M"} 中,对 size 值转换为M,然后打印出来


(7)ls -l |awk 'BEGIN {size=0;} {if($5!=4096){size=size+$5;}} END{print size/1024/1024,"M"}'


此命令在上个例子的基础上过滤掉了文件夹的大下


过滤是通过条件判断来实现的,文件夹的大小为 4096


awk中的条件语句是从C语言中借鉴来的,支持 if、while、do/while、for、break、continue


---


通过上面的几个例子,已经可以看到awk的概貌,也可以理解了为什么awk这么强大,它有内置变量、可以自定义变量、支持条件判断语句、支持正则表达式…… 可以视为一门语言了


awk还有很多其他高级用法,有兴趣的话可以深入学习一下


http://lihuaxi.xjx100.cn/news/242816.html

相关文章

解决 The mysql extension is deprecated and will be r

为什么80%的码农都做不了架构师?>>> 解决 The mysql extension is deprecated and will be removed in the future技术 maybe yes 发表于2015-07-27 15:19 原文链接 : http://blog.lmlphp.com/archives/132/Tutorial_of_solve_mysql_extension_is_depre…

Java swing是什么?有什么作用?

在早期JDK1.0发布时,Sun公司就为GUI开发提供了一套基础类库,这套类库被称为AWT(Abstract Window Toolkit),即抽象窗口工具包。AWT的起初设想就是为了统一实现不同操作系统的图像界面,但问题是,不同操作系统图形库的功能…

c#中接口的使用方法图解_C#图解教程 第十五章 接口

接口什么是接口接口是指定一组函数成员而不实现它们的引用类型。所以只能类和结构来实现接口。这种描述比较抽象,直接来看个示例。下例中,Main方法创建并初始化了一个CA类的对象,并将该对象传递给PrintInfo方法。classCA{public stringName;p…

Restore Volume 操作 - 每天5分钟玩转 OpenStack(60)

前面我们 backup 了 voluem,今天我们将讨论如何 restore volume。 restore 的过程其实很简单,两步走: 在存储节点上创建一个空白 volume。 将 backup 的数据 copy 到空白 voluem 上。 下面我们来看 restore 操作的详细流程: …

学习Java知识应该注意哪些基础原则

想要做java程序猿,学习起来没有那么快的,尤其是零基础学员,java技术在学习的过程中是比较枯燥的,下面小编就为大家详细的介绍一下学习Java知识应该注意哪些基础原则,方便大家在学习的时候能够更加有效率! 学习Java知识…

BZOJ 1194: [HNOI2006]潘多拉的盒子 [DP DFA]

传送门 题意: s个DFA,选出尽量多的自动机a0, a1, a2, . . . , at,使得a1包含a0、a2包 含a1,以此类推。s ≤ 50。 DFA的字符集为{0,1},有的节点是输出源,节点数n ≤ 50。 判断出包含关系后就是裸的最长路&a…

RestTemplate的GET多参数请求转发

请求方 RequestMapping(value "/movieFindByUser",method RequestMethod.GET)public Object findByUser(RequestParam(name "name", required false) String name, RequestParam(name "username", required false) String username, Reque…

华为云大数据存储的冗余方式是三副本_大数据入门:HDFS数据副本存放策略

大数据处理当中,数据储存始终是一个重要的环节,从现阶段的市场现状来说,以Hadoop为首的大数据技术框架,仍然占据主流地位,而Hadoop的HDFS,在数据存储方面,仍然得到重用。今天的大数据入门分享&a…