Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 如何使用sed/awk命令剪切字符串并附加到后续行?_Shell_Unix_Awk_Sed_Scripting - Fatal编程技术网

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

Shell 如何使用sed/awk命令剪切字符串并附加到后续行?,shell,unix,awk,sed,scripting,Shell,Unix,Awk,Sed,Scripting,需要您的帮助来解决我在编写shell脚本时面临的一个问题 在文本文件中,我的内容如下: 部署“精彩” mon_z1/0(c99-2230-333)运行 mon_z1/1(24a90-00d)运行 mon_z1/2(4b2-86a5fb2)运行 部署“rainbow” 邮递员(333-33-22sd)正在运行 邮政编码(8-333-33d)正在运行 =================================== 我正在寻找这样的输出—其中部署名称应附加到运行状态: 例如: 精彩:mon_z

需要您的帮助来解决我在编写shell脚本时面临的一个问题

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

部署“精彩

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

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

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

部署“rainbow

邮递员(333-33-22sd)正在运行

邮政编码(8-333-33d)正在运行

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

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

精彩:mon_z1/0(c99-2230-333)跑步

精彩:mon_z1/1(24a90-00d)跑步

精彩:mon_z1/2(4b2-86a5fb2)跑步

彩虹:赛后(333-33-22sd)跑步

彩虹:赛后(8-333-33d)跑步

请帮助我如何使用sed或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/
    -遇到运行状态的行时-打印带有相关部署名称的行

    • 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/
        -遇到运行状态的行时-打印带有相关部署名称的行


      您要求使用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\"); } }"
      
      cat data | perl-e“使用警告;使用严格;我的\$deployment;while(){if(\$\\\\=~/^deployment'(.*)/){\$deployment=\$1;}否则{print(\$deployment:\$\un\);}”
      
      或者,为了清晰起见,重写:

      use warnings;
      use strict;
      
      my $deployment;
      
      while (<>) {
          if ($_ =~ /^Deployment '(.*)'/) {
              $deployment = $1;
          } else {
              print("$deployment: $_\n");
          }
      }
      
      使用警告;
      严格使用;
      我的$部署;
      而(){
      如果($\=~/^Deployment'(.*)/){
      $deployment=$1;
      }否则{
      打印(“$deployment:$\n”);
      }
      }
      

      但请注意,在awk中重写此代码时,不需要
      while
      循环。Awk的主要优点是它隐式地在每一行上循环,并将其拆分为字段。

      您要求使用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\"); } }"
      
      cat data | perl-e“使用警告;使用严格;我的\$deployment;while(){if(\$\\\\=~/^deployment'(.*)/){\$deployment=\$1;}否则{print(\$deployment:\$\un\);}”
      
      或者,为了清晰起见,重写:

      use warnings;
      use strict;
      
      my $deployment;
      
      while (<>) {
          if ($_ =~ /^Deployment '(.*)'/) {
              $deployment = $1;
          } else {
              print("$deployment: $_\n");
          }
      }
      
      使用警告;
      严格使用;
      我的$部署;
      而(){
      如果($\=~/^Deployment'(.*)/){
      $deployment=$1;
      }否则{
      打印(“$deployment:$\n”);
      }
      }
      

      但请注意,在awk中重写此代码时,不需要
      while
      循环。Awk的主要优势在于它隐式地在每一行上循环并将其拆分为字段。

      这里是另一个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 != "" 
      

      这需要注意操作只在非空的行上执行

      这里是另一个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 != "" 
      

      这需要注意操作只在非空的行上执行

      你为自己做了什么?将你的研究成果发布到这个问题上,即使它不成功,也可能重复“非常感谢你的投入:)你为自己做了什么?把你的研究成果贴到这个问题上,即使它不成功,也可能重复以下内容:)非常感谢你的投入:)非常感谢你的投入:)非常感谢你的投入:)非常感谢你的投入:)非常感谢你的投入:)非常感谢你的投入:)非常感谢你的投入:)