awk next多行合并
在awk进行文本处理时候,我们可能会遇到。将多行合并到一行显示问题。awk next语句对多行合并非常有用:其在循环时逐行匹配,如果遇到next,就会跳过当前行,直接忽略下面语句。而进行下一行匹配。
示例1:
测试文本内容如下 :
1[root@361way srv]# cat text.txt
2a
3b
4c
5d
6e
只打印偶数行的内容,并显示行号:
1[root@361way srv]# awk 'NR%2==1{next}{print NR,$0;}' text.txt
22 b
34 d
当记录行号除以2余 1,就跳过当前行。下面的print NR,$0
也不会执行。 下一行开始,程序有开始判断NR%2 值。这个时候记录行号是:2 ,就会执行下面语句块:'print NR,$0'
。这里是为了演示next的用法,在实际应用中,更多会使用下面的用法:
[root@361way srv]# awk ‘NR%2==0{print NR,$0;}’ text.txt 2 b 4 d
示例2:
测试文件内容如下:
1# cat test.txt
2web01[192.168.2.100]
3httpd ok
4tomcat ok
5sendmail ok
6web02[192.168.2.101]
7httpd ok
8postfix ok
9web03[192.168.2.102]
10mysqld ok
11httpd ok
输出时为了美观,我想让每台服务器的服务及OK值在同一行,这里可以通过如下代码实现:
1[root@361way srv]# awk '/^web/{T=$0;next;}{print T":\t"$0;}' test.txt
2web01[192.168.2.100]: httpd ok
3web01[192.168.2.100]: tomcat ok
4web01[192.168.2.100]: sendmail ok
5web02[192.168.2.101]: httpd ok
6web02[192.168.2.101]: postfix ok
7web03[192.168.2.102]: mysqld ok
8web03[192.168.2.102]: httpd ok
上面的功能就python也可以搞定,不过略麻烦而已,如下 :
1#coding:utf-8
2ip = None
3for line in open('ips.txt', 'r'):
4 line = line.strip()
5 if line.startswith('web0'):
6 ip = line
7 else:
8 print '%s:%s' % (ip, line)
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/awk-next-merge-lines/4923.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.