最近太忙了,所以关于shell脚本中awk的部分一直没有整理,今天碰巧在做项目的时候用到了awk,所以决定好好的整理总结一下。
一、前言
二、awk是什么
三、awk的工作原理与格式介绍
四、awk的参数格式说明
五、总结
一、前言
在shell脚本里面,大体来说我们可以把所有命令拆分成两种命令,第一种命令是查询命令,比如说free,top等等,还有第二种命令就是处理命令,这里面有很多,比如我之前写过的grep,cut,sed,awk等等(反正至少目前常用的好像就这些)。不过这些命令其实有一些是重叠的,我们可以把这些命令分成两个部分,分别是按照行来进行处理,这个命令我一般用grep就够了,还有一种就是处理列的部分,这个命令目前我用awk就可以解决了。因此其实我在处理字符串的时候用grep和awk这两个命令就足够了。
二、awk是什么
前面提到过了,awk其实就是一种处理文本的命令,它的主要处理是按照列来进行处理文本(有很多书上把它当成一门语言来用,不过我还没有用到那么深)。
三、awk的工作原理和格式介绍
awk的工作原理为:按照行来进行处理,也就是说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。所以一般来说awk命令不跟循环语句连用,因为根本不需要。
awk的格式介绍:我们从小到大来介绍awk的格式
1、awk + '{action}' + filename 这是awk中最小的格式了,前面awk表示我要执行awk命令,后面action表示我要执行的动作,filename表示我要找到的文件名。
这里有两点要说明:1、没有+
2、一般来说action就是print或者printf命令,到目前为止我还没用过其他的action命令。
3、awk中必须有这三条参数,后续加的所有条件都可以没有,但唯独这三条必须有。
2、awk + 'condition + {action}' 当我们有了action之后我们就需要执行判定条件了,这里的判定条件指的是比如我要打印多少行等等。
3、awk + -F + 'cutcondition' + ' {condition + action}' 之后我们需要拓展它的切割条件,我们默认的话切割的是空格,但是如果我们想要指定切割目标那么我们就需要这个东西了。
4、awk + -F + 'cutcondition' + 'BEGIN{condition+action} + {condition + action}+END{condition + action}' 这是awk最全的表达式,awk支持BEGIN和END命令,这两个命令的意思是,在开始的时候先执行BEGIN中的命令,在结束的时候执行END中的命令。
这里要说明的是:一般来说BEGIN和END只作为一些标注或者辅助作用,不作为处理文本的主要环节,处理文本还是要按照中间的部分。
四、awk的参数格式说明
好了,搞清楚了awk的格式,我们就来说说awk的参数格式说明,我们通过awk的格式可以看出,awk的参数主要由三部分构成,分别是cutcondition,condition和action。下面我们从前到后逐步说明一下注意事项。
4.1 cutcondition的说明
cutcondition,就是设置以什么方式进行切割,之前也说了,awk默认就是按照空格来进行切割的,但是在很多时候我们可能需要其他的条件进行切割,所以这就需要修改。这里的修改主要指两个方面,第一是内容的修改,第二是数量的修改
内容的修改:例如如果我们要以:来进行分割,那么我们可以这样awk -F '[:]'这样就可以了。
数量的修改:例如如果我们要以:和+来进行分割,那么我们可以这样awk -F '[:+]',这样就可以了。
这里要说明一点,就是如果以符号和空格来进行分割,如果我们携程awk -F '[+ ]',这样写就以+和一个空格来进行分割,这个需要我们在写之前先把文本格式排一下才可以。
4.2 condition的说明
condition指的是我们在使用之前需要配置的参数,比如说我们要打印多少行等等。这里一般来说我们要写两点:
第一是行数,我们知道awk主要是处理列的,对行的处理并不擅长(其实一般来说awk和grep一块用的时候更多),但是里面还有一些简单的处理行数的办法,比如我们要打印第二行,就是'NR==2'即可。
第二是匹配字符,比如我们要匹配root字符,我们可以这么写'/root/'即为匹配root的字符串。
这里有一点要注意,即为如果我们想要添加多个条件,我们可以采用if语句,不过这个if语句添加稍有不同,即:
前者:'NR==2 {action}'
后者:'{if(NR > 1 && NR < 3) action}'
括号的位置不同
4.3 action
action的话主要是用来打印的,这里要说的是打印有print和printf两种打印方法,print的格式为 print 内容,相对来说比较死板,但是用起来比较容易,而printf则比较灵活,可以指定前缀和格式,例如printf("filename is:%10s ",FILENAME),这样的形式。
最后,awk有一个内置变量表,我直接引用了其他博客的:
ARGC 命令行参数个数 ARGV 命令行参数排列 ENVIRON 支持队列中系统环境变量的使用 FILENAME awk 浏览的文件名 FNR 浏览文件的记录数 FS 设置输入域分隔符,等价于命令行 -F选项 NF 浏览记录的域的个数 NR 已读的记录数 OFS 输出域分隔符 ORS 输出记录分隔符 RS 控制记录分隔符 $0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域,......以此类推。 |
五、总结
本文主要写了awk的用途,格式,工作场景,以及它的用法声明。当然这个东西还得多用才能理解的啦。