您的位置:首页 > 其它

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

2017-06-03 12:02 141 查看
最近在学习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,次语句还是比较绕的,大家好好练习以下
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: