如何使用sed / awk命令剪切字符串并附加到后续行?

时间:2017-06-21 09:21:32

标签: shell unix awk sed scripting

在编写shell脚本时,需要您的帮助来解决我遇到的一个问题。

在文本文件中,我的内容如下:

部署'精彩'

mon_z1 / 0(c99-2230-333)正在运行

mon_z1 / 1(24a90-00d)正在运行

mon_z1 / 2(4b2-86a5fb2)正在运行

部署'彩虹'

post_m(333-33-22sd)正在运行

post_s(8-333-33d)正在运行

===================================

我正在寻找类似这样的输出 - 其中部署名称应附加到运行状态: 示例:

精彩:mon_z1 / 0(c99-2230-333)正在运行

精彩:mon_z1 / 1(24a90-00d)正在运行

精彩:mon_z1 / 2(4b2-86a5fb2)正在运行

彩虹:post_m(333-33-22sd)正在运行

彩虹:post_s(8-333-33d)正在运行

请帮助我如何使用sed或awk命令实现

3 个答案:

答案 0 :(得分:1)

awk 解决方案:

awk '/Deployment/{ gsub("\047","",$2); d=$2; next }$3~/running/{ print d,":",$0 }' file

输出:

wonderful : mon_z1/0 (c99-2230-333) running
wonderful : mon_z1/1 (24a90-00d) running
wonderful : mon_z1/2 (4b2-86a5fb2) running
rainbow : post_m (333-33-22sd) running
rainbow : post_s (8-333-33d) running
  • /Deployment/{...} - 执行有关遇到部署行的操作

  • gsub("\047","",$2) - 从部署名称中删除单引号

  • d=$2 - 捕获部署名称

  • $3~/running/ - 遇到正在运行状态的行 - 打印具有相关部署名称的行

答案 1 :(得分:1)

这是另一个awk解决方案:

awk 'BEGIN{FS="\047"}/^Deployment/{ x = $2; next }$0 != ""{ print x, ":" ,$0 }' file 

输出:

wonderful : mon_z1/0 (c99-2230-333) running
wonderful : mon_z1/1 (24a90-00d) running
wonderful : mon_z1/2 (4b2-86a5fb2) running
rainbow : post_m (333-33-22sd) running
rainbow : post_s (8-333-33d) running

它与RomanPerekhrest的相似。不同之处在于我用以下方法过滤掉空字符串:

$0 != "" 

这样可以确保仅对非空行执行操作。

答案 2 :(得分:0)

你问过sed或awk,但是我将在perl中提供一个很容易翻译成awk的例子。诀窍是如何访问匹配(部署的名称)。您可以使用像RomanPerekhrest这样的技术并删除'来自第二个字段的标记,或者您可以使用正则表达式匹配并从匹配组中获取部署名称。这就是我所做的,因为它在perl中非常简单。作为命令行:

cat data | perl -e "use warnings; use strict; my \$deployment; while (<>) { if (\$_ =~ /^Deployment '(.*)'/) { \$deployment = \$1; } else { print(\"\$deployment: \$_\n\"); } }"

或者,为了清晰起见重写:

use warnings;
use strict;

my $deployment;

while (<>) {
    if ($_ =~ /^Deployment '(.*)'/) {
        $deployment = $1;
    } else {
        print("$deployment: $_\n");
    }
}

但请注意,当您在awk中重写此内容时,您不需要while循环。 Awk的主要优势在于它隐含地遍历每一行并将其分成字段。