首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

AWK命令打开的正确方式

在最开始实习的时候,小编跟了一位shell大神一起做项目,当时对于他能够随手使用shell脚本,完成很多日常工作非常羡慕,于是对于shell的使用萌发了学习的念头。

在 linux 系统日常处理工作中,经常会遇到对文本进行处理的业务场景:比如对从数据库中查询的数据进行信息抽取和处理,又或者对于不同接口传递来的消息进行处理。

在此过程中,awk作为最常用的文本处理工具之一,在实际的开发中发挥着非常重要的作用。

秉持着小编一贯的理念,用最精炼的语言,传递给大家最多的知识,引大家入门,所以小编在此写下了一些awk命令快速入门的心得,抛砖引玉。

awk是什么

awk是一种程序设计语言:允许创建简短的程序,处理文本文件。

awk是一种文本分析工具:适合格式化文本,对文本进行复杂的格式处理。

awk的来源

awk的名称来自于其创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏首字母。

awk基本用法

首先请记住:awk以文件的一行为处理单位

在使用过程中,awk每接收一行,然后执行相应的命令,来处理这一行的文本。

不管你看到的一个awk命令多么复杂,多么高端,它总能归结于下述的这行命令模版。

这行命令翻译成自然语言的意思就是:

小编要开始处理filenames这个文件中的文本啦,首先用awk命令把其中的每一行都读出来,然后利用正则表达式pattern筛选出需要处理的文本,对其进行action的操作处理。

请记住,action是被{}包裹的,而pattern则不能被{}包裹。

还是不懂?没关系,咱们来举个例子。

假设有一个文件test.txt,内容如下:

接下来执行命令

这里需要解释的是,awk默认使用空格或制表符作为分隔符对输入的一行文本进行分组处理,并删除多余的空格。分割后的结果中,$0代表整行内容,$1代表分割后的第一部分内容,$2代表第二部分,依次类推。

我们套用命令模版对这个命令进行解释:对test.txt文件里的每一行文本,执行被{}包裹的action操作 print $1。awk命令首先对每一行按照空格进行分割,并打印出第一部分的内容,结果如下:

可能有的人会疑问,上面的命令为什么没有pattern,实际上在这里是一种特殊情况,即pattern为空的情况,之后在进阶用法里,会有一些更加复杂的例子包含pattern非空的情况。

如果不想以空格为分隔符的话,也是可以的

使用-F参数,指定逗号作为分隔符,结果如下

awk进阶用法

你可能会说,awk命令的使用也太简单了,别着急,接下来会介绍一些比较复杂的使用方法。

方法一,使用内置变量:

文件内容:

命令:

输出结果:

该命令是打印出3到5行之间,每一行文本的第一部分。其中NR是内置变量,表示行号,awk命令中还有很多内置变量的使用,感兴趣的同学请自行查阅,这里不再一一列出。

方法二,常量pattern:

文件内容:

命令:

输出结果:

该命令的pattern是一个常量1,在这里就引出了一个问题,如果常量作为一个pattern,那么如何判定是否匹配成功呢,在这里规定:

凡是非0的数字,表示pattern匹配成功, pattern为真;否则表示匹配失败, 为假。

凡是非空的字符串,表示pattern匹配成功, pattern为真;否则表示匹配失败, 为假。

以上示例就是pattern匹配成功的结果。

方法三,正则表达式pattern:

文件内容:

命令:

输出结果:

该命令的pattern就是一个正则表达式,它匹配出了以3开头,第二位字符为从3到5的那些文本,并打印出来。

方法四,BEGIN和END的使用:

文件内容:

命令:

输出结果:

该命令是打印每一行的第一部分相加之后的和。

分析这条命令,包含了三条pattern 规则,分别是:

BEGIN

END ’

其中BEGIN 和 END 是两个特殊的pattern,分别表示在处理文件之前和处理文件之后匹配成功。

第一条规则表示在处理文本之前,赋予变量sum值为0。

第二条规则表示,对于文本中的每一行的第一部分,都被加到sum变量上。

第三条规则表示在处理文本之后,打印出sum的最终结果。

awk、sed、grep对比

grep: 文本过滤器,主要功能是过滤文本,结合正则表达式使用,效率比其他两者要高的多。

sed:以行为单位的文本编辑工具,但是只对缓冲区中原始文件的副本进行编辑,并不编辑原始的文件,若需要保存改动内容则需要重定向到另一个文件。

awk:同样是以行为单位的文本编辑工具,可以从文件或字符串中基于指定规则浏览和抽取信息。awk比sed强的地方在于不仅能以行为单位还能以列为单位处理文本文件。

结语

本文所介绍的都是awk命令最简单的使用方法,实际上awk虽然语言简练,但是功能之强大令人叹为观止,在这里小编只是用最短的时间,最简单的例子帮助感兴趣的同学入门,避免他们一上手就接触过于复杂的语法和使用场景,产生畏难情绪。

如果大家感兴趣的话,可以在评论区留言,小编会在之后的文章中介绍更加复杂的使用场景。

欢迎关注

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180306G16LLG00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券