在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)