awk next多行合并

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




本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

分类: perl/php/python/gawk/sed 标签: