🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
awk是什么?awk是一个**报表生成器**,拥有强大的文本格式化的能力。我们可以利用awk来处理文本,整理成各种“表”的样子。 awk 是由 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 三个创造者的姓氏的首个字母组成,早期应用于Unix上,所以我们现在使用的Linux版的awk其实是gawk,也就是GNU awk。 awk其实是一门脚本语言,它支持条件判断、数组、循环等功能 事实上,grep 、sed、awk 被称为 linux 中的 "三剑客"。 * grep 适合单纯的查找或匹配文本 * sed 适合编辑匹配到的文本 * awk 适合格式化文本,对文本进行较复杂格式处理 ## awk基础 awk的基本语法如下, ~~~ awk [options] 'program' file1 , file2 , …… ~~~ 其中program也可以细分为pattern和action,也就是说 ~~~ awk [options] 'Pattern{Action}' file ~~~ action 指的就是动作,awk 擅长文本格式化,并且将格式化以后的文本输出,所以 awk 最常用的动作就是 print 和 printf 比如testd文件中含有"ddd"三个字符 那么使用`awk '{print}' testd`,就会返回`ddd` 下面我们可以看另一个场景: ![](https://raw.githubusercontent.com/dy2903/gallery/master/20181115093024.png) 其中`awk '{print $5}'`表示输出df信息的第5列,$5表示将当前行按照**分隔符**分隔后的第5列,默认指定空格为分隔符。 另外awk自动将**连续的**空格理解为一个分隔符。 awk是逐行处理的,也就是当awk处理一个文本的时候,会一行一行的处理,默认以“换行符”为标记。 ![](https://raw.githubusercontent.com/dy2903/gallery/master/20181115093231.png) > $0表示显示整行,$NF表示当前行分割后的最后一列,NF表示当前行被分割开以后,一共有几个字段。也就是说,如果一行文本给空格分成了7段,那么NF的值就是7,$NF的值就是$7,而$7表示当前行的第7个字段,也就是最后一列,那么倒数第二列就是$(NF-1) 我们也可以一次输出多列,使用**逗号**进行隔开 ~~~ awk '{print $1,$2}' test ~~~ 如果某一行没有第2列,则第2列不会有输出。 除了输出文本的列,我们还可以添加的字段,与文件中的列结合起来。 ![](https://raw.githubusercontent.com/dy2903/gallery/master/20181115093453.png) ## Pattern 之前介绍了最常用的Action,也就是print。 下面我们来介绍一下Pattern,也就是模式。 AWK 包含两种特殊的模式:BEGIN 和 END。 * BEGIN 模式:指定了处理文本之**前**需要执行的操作: * END 模式:指定了处理完所有行之**后**所需要执行的操作: ![](http://p8a6vmhkm.bkt.clouddn.com/picgo20180919140934.png?picgo) 也就是表示在处理test文件之前,先执行打印动作。既然还没开始处理test中的文本,也可以不指定test文件 如果我们想awk先执行BEGIN指定的动作,然后再根据我们自定义的动作去操作文本, ![](http://p8a6vmhkm.bkt.clouddn.com/picgo20180919141114.png?picgo) 上图中先打印出了 "aaa bbb",当 BEGIN 模式对应的动作完成后,在使用后面的动作处理对应的文本,即打印 test 文件中的第一列与第二列