正则介绍 awk

前面也提到了 awk 和 sed 同样是流式编辑器,它也是针对文档中的行来操做的,一行一行的去执行。awk 比 sed 更增强大,它能作到 sed 能作到的,一样也能作到 sed 不能作到的。awk 工具实际上是很复杂的,有专门的书籍来介绍它的应用,不过我认为学那么复杂没有必要,只要能处理平常管理工做中的问题便可。正则表达式

 

 

一样的,作一下准备工做,见下图,vim

先操做 awk 最简单的功能,指定分隔符 -F ,来查看一下文件 test.txt 的内容,见下图,编辑器

接着指定分隔符为“:”,输出第一列,见下图,工具

上图的操做命令,也不会更改文件的内容,跟 sed 同样。既然能够输出第一列,也能够输出指定的列或是所有输出,输出第三列,见下图,测试

输出所有的列,用 $0 表示,见下图,blog

所有输出还有一个简单的命令,不用指定分隔符,不用 -F,见下图,排序

 

来试着操做一下,不指定分隔符的状况,先建立一个测试的文件 1.txt ,输入 vim 1.txt ,回车,见下图,文档

输入上图内容,保存后退出。接着往下操做,字符串

以上说明 awk 忽略 -F 的选项,也就是没有指定默认的分隔符,默认会以空格或是空白字符为分隔符去打印。想要多打印几列,就能够用“,”来显示。数学

上图中的分隔符,除了空格,也可使用 # ,要用双引号引发来 "#",见下图,

假如须要分的段比较多的话,用以上操做就会很是麻烦,实际上还有一种方法,等会会说。

接着来讲一下 awk 的匹配功能,见下图,

上图第二个命令就是 awk 和 sed 、grep 不一样的地方,能够分列匹配查找。awk 一样也支持正则表达式,见下图,

上图命令使用了正则表达式 + 。awk 这边比 grep 和 sed 强大的地方是,使用到正则表达式的时候都不用加选项或是脱义字符。,能够直接写出命令并执行。

awk 也支持同时使用多个表达式,见下图,

上图中,包含 root 和 user 的结果,并无所有显示出 root 或 user,可使用命令 grep -E 命令来验证结果。awk 命令也能够用上图 grep -E 的命令形式,结果是同样的,见下图,

接着来看一下数学公式计算的用法,见下图,

上图命令必定要写两个等号 == ,才能表示等于。写一个等号 = 的话就至关于赋值了。{ } 花括号的内容不写的话,默认是所有输出。也可使用 >= 大于等于号,验证结果以后也是没错的。若是在数值上面用“”双引号引发来的话,是什么结果呢?见下图,

上图的命令,在数值上加了 " " 双引号,至关于 sort 命令不加 -n ,就是以 ASCII 码的排序方式来计算的,命令就会认为双引号里面的内容是字符串而不是数字。因此,命令里面的数字要用来计算的话,就不能加双引号。

还有不等于号,用 != 表示,见下图,

上图命令中 /sbin/nologin 表示的是字符串,因此要用双引号。结果能够看到,显示出来的行里面,最后一段都没有 /sbin/nologin 。其中 != 这边没有使用空格,要注意。

 

除了上面使用数字进行比较以外,还能够列与列之间进行比较,见下图,

还能够两个条件在一块儿使用,见下图,

&& 表示而且的意思,注意上面数字使用的是双引号 “”,因此结果出现了 59 。

除了而且以外,还有或者,见下图,

|| 表示或者,两个条件知足其中一个就能够。接着往下操做,

~ 表示匹配包含。

OFS 内置变量,用来表示输出的分隔符,具体用法见下图,

OFS 须要用 { } 花括号括起来,而且用在单引号 ' ' 命令的最前面,接着才是条件和 print 语句。 不写中间的条件的话,就是所有,见下图,

条件里面还能够写入逻辑语句,见下图,

定义输出的分隔符和输出的内容中间,就是条件,中间的条件和后面的 print 能够一块儿写,用花括号 { } 整个括起来。表示 if $3>1000 ,就输出 一、三、7 列。下面这条命令的写法,就是省略掉了 if ,if 去掉能够去掉不少符号。可是加上 if 以后,比较好理解。

下面再介绍两个内置的变量,除了OFS,还有 NR 和 NF 。NR 表示行,NF 表示列。接着举例子,见下图,

结果显示出来,至关于 grep -n 的做用,显示行号。NF 就是显示列号,见下图,

结果所有是 7 列。

如今不妨改一下文件 test.txt 的内容,输入 vi test.txt ,回车,见下图,

将第一行的内容,删除一列,保存后退出,接着往下操做,

能够看到第一行的列数变为 6 了。

NR 和 NF 还能够做为判断的条件, 具体用法见下图,

上图第一条命令显示的结果是前十行。第二条命令显示还能够两个条件一块儿用。

接着看下面这个例子,:冒号须要用双引号 ""引发来,

由于 NR 一共只有 7 列,全部结果显示的行,就前面7行有前半部分,

对于上图命令的理解,用这么一段话解释:

awk 是按行处理文件的,每一行都有awk内置变量:NF,NR

NF:是按给定的分隔符,分出来总的段数, 全部$NF,指最后一段。

NR:是当前行的行号。$NR,表示 第N行的第N段。

老师的示例中,每行有7段,因此,前面7行,第一列,分别显示当前行的段。如第一行显示第一段,第二行显示 第二段,第三行显示 第三段。。。。

以上说明,加上$和不加$,是不同的。

接着来看一个和 == 两个等号相对应的功能,见下图,

能够看到,第一条命令的 = 等号就是赋值,前三行的第一列都变成 root 了。第二条命令的 == 两个等号才是等于的意思。第一条命令的结果没有分隔符,能够输入变量 OFS 来定义分隔符,见第三条命令。

接着再往下操做,见下图,

这边的 tot 是求和的意思, tot=tot+$3  意思是,新的tot的值,为旧的tot的值和$3的值的和。这个 tot 的值以前并不存在,因此默认是 0 ,从 0 开始求和,每一行的第3列相加。相加完成以后,就输出 tot 的值。

这里的END要注意一下,表示全部的行都已经执行,这是awk特有的语法。其实awk连同sed均可以写成一个脚本文件,并且有他们特有的语法,在awk中使用 if 判断、for 循环都是能够的,只是平常管理工做中没有必要使用那么复杂的语句而已。

 

总结:

-F 指定分隔符

$0 所有输出

两个等号 == ,才能表示等于

数值上加了 " " 双引号,输出结果就是以 ASCII 码的排序方式来计算

!= 表示不等于

&& 表示而且

|| 表示或者

OFS 内置变量,用来表示输出的分隔符

内置变量 NR 表示行,NF 表示列

相关文章
相关标签/搜索