在awk进行文本处理时候,我们可能会遇到。将多行合并到一行显示问题。awk next语句对多行合并非常有用:其在循环时逐行匹配,如果遇到next,就会跳过当前行,直接忽略下面语句。而进行下一行匹配。
示例1:
测试文本内容如下 :
[root@361way srv]# cat text.txt a b c d e
只打印偶数行的内容,并显示行号:
[root@361way srv]# awk 'NR%2==1{next}{print NR,$0;}' text.txt 2 b 4 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:
测试文件内容如下:
# cat test.txt web01[192.168.2.100] httpd ok tomcat ok sendmail ok web02[192.168.2.101] httpd ok postfix ok web03[192.168.2.102] mysqld ok httpd ok
输出时为了美观,我想让每台服务器的服务及OK值在同一行,这里可以通过如下代码实现:
[root@361way srv]# awk '/^web/{T=$0;next;}{print T":\t"$0;}' test.txt web01[192.168.2.100]: httpd ok web01[192.168.2.100]: tomcat ok web01[192.168.2.100]: sendmail ok web02[192.168.2.101]: httpd ok web02[192.168.2.101]: postfix ok web03[192.168.2.102]: mysqld ok web03[192.168.2.102]: httpd ok
上面的功能就python也可以搞定,不过略麻烦而已,如下 :
#coding:utf-8 ip = None for line in open('ips.txt', 'r'): line = line.strip() if line.startswith('web0'): ip = line else: print '%s:%s' % (ip, line)
《awk next多行合并》有3条评论