cat file
web01[10.10.1.1]
httpd ok
tomcat ok
sendmail ok
web02[10.10.1.2]
httpd ok
postfix ok
web03[10.10.1.3]
mysqld ok
httpd ok
要得到这样的格式:
web01[10.10.1.1] httpd ok
web01[10.10.1.1] tomcat ok
web01[10.10.1.1] sendmail ok
web01[10.10.1.1] web02[10.10.1.2]
web01[10.10.1.1] httpd ok
web01[10.10.1.1] postfix ok
web01[10.10.1.1] web03[10.10.1.3]
web01[10.10.1.1] mysqld ok
web01[10.10.1.1] httpd ok
-
sed '/web/{h;d};G;s/\(.*\)\n\(.*\)/\2: \1/' file
[解析]
这是最常规的思路,匹配到 web 关键字的行拷贝到 pattern space 里,然后在非关键字的行,G 追加在后面,然后再用替换成相应的格式。
-
sed ':1;h;$!N;/]$/D;s/\n/ /p;g;b1' file
[解析]
这是今天看到的一个新思路,步骤其实要比上个命令烦琐一点,但是代码要简洁很多,该命令的关键是 N 读取下一行,如果不匹配 ] 符号结尾,就替换成一行,然后打印,关键是这里 g 又再次覆盖 pattern space ,然后 b 跳转去行首,继续读取下一行。如果读去到了标签行,就 D 删除上一个标签,并跳转行首,h 覆盖掉以前的标签,继续执行下面的读去操作,又替换,一直末行 $!N 不会再读去下一行,然后进行替换打印,继续操作 g;b1 跳去命令行首,一直到 D 结束整个命令。思路非常不错。
再延伸一下, 如果标签在下方呢:
httpd ok
tomcat ok
sendmail ok
web01[10.10.1.1]
httpd ok
postfix ok
web02[10.10.1.2]
mysqld ok
httpd ok
web03[10.10.1.3]
得到:
web01[10.10.1.1] httpd ok
web01[10.10.1.1] tomcat ok
web01[10.10.1.1] sendmail ok
web02[10.10.1.2] httpd ok
web02[10.10.1.2] postfix ok
web03[10.10.1.3] mysqld ok
web03[10.10.1.3] httpd ok
-
sed -n ':a;/]/!{N;ba};s/.*\n\(.*\)/\1 &/;/\n/P;D' file
阅读(3055) | 评论(0) | 转发(2) |