文本处理工具之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,次语句还是比较绕的,大家好好练习以下
一、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,次语句还是比较绕的,大家好好练习以下
相关文章推荐
- Java 并发 (多线程) 讲解<一>
- ext js的讲解<一>
- 2️⃣GCD API讲解<一>
- TCP/IP协议讲解 <一>
- <一>awk变量和运算符
- Android代码模版整理<一>
- 菜单展开 合并<一>
- 图像tamura特征提取<一>
- Mybaties中的总结<一>
- AFNetworking2.0源码解析<一>
- C++ 之网络编程<一>
- Android学习之 有关图片缓存问提的代码封装<一>
- python模块之paramiko学习<一>
- 在cocos2d-x 3.2下利用UI下面的控件模仿实现GridView部分效果<一>实现构思
- cocos2d-x学习<一> 打包apk(win7+vs2012+eclipse+cygwin)
- 路由器RIP协议配置命令<一>
- BaseDAO开发及获取泛型的传输数据类型(Class<T>)实例讲解
- <win8>(四)实例讲解win8(XAML+C#)开发--------课程表:Snapped模式和动态磁贴,徽章(badge)
- <C++学习笔记一>——多继承
- 控件中常用语句总结<一>