文本处理工具之AWK讲解<一>

来源:互联网 发布:php纯文字游戏源码 编辑:程序博客网 时间:2024/06/01 09:16

最近在学习AWK的知识,现在拿出来和大家分享一下。希望能帮助到大家

一、awk中的if和alse的用法

比如我有一个file文件,内容为

[root@bogon ~]# cat file 
AA
BB
CC
AA
DD
EE

现在我们的要求是把文件中的AA后标记一个“YES”标记,不是AA的后面标记一个“NO”标记,此时我们就可以用到if判断

[root@bogon ~]# awk '/AA/{print $0" YES"}!/AA/{print $0" NO"}' file 
AA YES
BB NO
CC NO
AA YES
DD NO
EE NO

[root@bogon ~]# awk '{if($0~/AA/) {print $0" YES"}else{print $0" NO"}}' file 
AA YES
BB NO
CC NO
AA YES
DD NO
EE NO


二、next的用法

next的作用是跳过代码,还用上面的例子,此时我们用next来解决

[root@bogon ~]# awk '/AA/{print $0" YES";next}{print $0" NO"}' file 
AA YES
BB NO
CC NO
AA YES
DD NO
EE NO

语句的执行逻辑是:如果匹配到AA就打印$0" YES",第一行匹配住,next后面的代码不执行,当检查第二行时,前面没有匹配住,就执行next后面的代码


三、printf不换行输出

文件如下

[root@bogon ~]# cat file 
VMware:pro workstation
Name:
zhangsan lisi wangwu
zhonghuo:beijing shanghai
meiguo:jialifuniya maiami

要求:将第二行和第三行合并

[root@bogon ~]# cat file | awk '/Name:/{printf $0}!/Name:/{print $0}'
VMware:pro workstation
Name:zhangsan lisi wangwu
zhonghuo:beijing shanghai
meiguo:jialifuniya maiami

[root@bogon ~]# cat file | awk '/Name:/{printf $0;next}1'
VMware:pro workstation
Name:zhangsan lisi wangwu
zhonghuo:beijing shanghai
meiguo:jialifuniya maiami

第一种方法也许还明白,但是第二种方法有点懵逼,这是什么鬼???其实和第一种方式一样,next是跳过代码,如果匹配住了Name则不换行输出,如果没匹配住就执行默认的print $0


四、awk变量的用法

[root@bogon ~]# cat file 
VMware:pro workstation
Name:zhangsan lisi wangwu
zhonghuo:beijing shanghai
meiguo:jialifuniya maiami

要求:如果匹配住了VMware:pro workstation就把Name:zhangsan lisi wangwu复制一份到最后一行

[root@bogon ~]# cat file | awk '/^VM.*:.*$/{a=1}/^Name:.*$/&&a{b=$0}END{if(b) print b}1'
VMware:pro workstation
Name:zhangsan lisi wangwu
zhonghuo:beijing shanghai
meiguo:jialifuniya maiami
Name:zhangsan lisi wangwu

知识点:在awk变量中,0和空都代表假,其余都代表真。我们看'/^VM.*:.*$/{a=1},如果匹配到这段字符,我们就赋值变量a为真,如果检查到真则继续执行后面的代码,匹配第二行,然后再判断是否为真,为真把此行赋值给变量b,END代表在最后执行,如果不加if(b)会打印一个空行,然后在最后执行以下print b,我们反过头来看,我们匹配到第二行的时候,前面为假,所以直接执行最后的1也就是print $0,次语句还是比较绕的,大家好好练习以下




原创粉丝点击