9.6 awk命令正则表达式
awk 最简单的功能,指定分隔符 -Fvim
上图的操做命令,也不会更改文件的内容,跟 sed 同样。既然能够输出第一列,也能够输出指定的列或是所有输出,输出第三列测试
输出所有的列,用 $0 表示,所有输出还有一个简单的命令,不用指定分隔符,不用 -Fspa
不指定分隔符的状况,先建立一个测试的文件 1.txt ,输入 vim 1.txt ,回车排序
以上说明 awk 忽略 -F 的选项,也就是没有指定默认的分隔符,默认会以空格或是空白字符为分隔符去打印。想要多打印几列,就能够用“,”来显示。字符串
上图中的分隔符,除了空格,也可使用 # ,要用双引号引发来 "#" 数学
awk 的匹配功能awk
awk 和 sed 、grep 不一样的地方,能够分列匹配查找。awk 一样也支持正则表达式变量
上图命令使用了正则表达式 + 。awk 这边比 grep 和 sed 强大的地方是,使用到正则表达式的时候都不用加选项或是脱义字符。,能够直接写出命令并执行。
awk 也支持同时使用多个表达式,sed
上图中,包含 root 和 user 的结果,并无所有显示出 root 或 user,可使用命令 grep -E 命令来验证结果。awk 命令也能够用上图 grep -E 的命令形式,结果是同样的,见下图,
看一下数学公式计算的用法,见下图
必定要写两个等号 == ,才能表示等于。写一个等号 = 的话就至关于赋值了。{ } 花括号的内容不写的话,默认是所有输出。也可使用 >= 大于等于号,验证结果以后也是没错的。若是在数值上面用“”双引号引发来的话,是什么结果呢?见下图,
上图的命令,在数值上加了 " " 双引号,至关于 sort 命令不加 -n ,就是以 ASCII 码的排序方式来计算的,命令就会认为双引号里面的内容是字符串而不是数字。因此,命令里面的数字要用来计算的话,就不能加双引号。还有不等于号,用 != 表示,见下图,
root表示的是字符串,因此要用双引号
除了上面使用数字进行比较以外,还能够列与列之间进行比较
还能够两个条件在一块儿使用,见下图,
&& 表示而且的意思,注意上面数字使用的是双引号 “”.
除了而且以外,还有或者,见下图,
|| 表示或者,两个条件知足其中一个就能够。接着往下操做
~ 表示匹配包含
OFS 内置变量,用来表示输出的分隔符,具体用法见下图,
OFS 须要用 { } 花括号括起来,而且用在单引号 ' ' 命令的最前面,接着才是条件和 print 语句。 不写中间的条件的话,就是所有,见下图,
条件里面还能够写入逻辑语句
定义输出的分隔符和输出的内容中间,就是条件,中间的条件和后面的 print 能够一块儿写,用花括号 { } 整个括起来。表示 if $3>999,就输出 一、三、7 列。下面这条命令的写法,就是省略掉了 if ,if 去掉能够去掉不少符号。可是加上 if 以后,比较好理解。
下面再介绍两个内置的变量,除了OFS,还有 NR 和 NF 。NR 表示行,NF 表示列。接着举例子,见下图,
3
结果显示出来,至关于 grep -n 的做用
NR 和 NF 还能够做为判断的条件, 具体用法见下图,
接着看下面这个例子:
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 表示列