【问题标题】:How to use sed/awk commands to cut a string and append to the succeeding lines?如何使用 sed/awk 命令剪切字符串并附加到后续行?
【发布时间】:2017-11-24 02:38:23
【问题描述】:

需要您帮助解决我在编写 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 命令实现

【问题讨论】:

标签: shell unix awk sed scripting


【解决方案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/{...} - 在遇到 Deployment 行时执行操作

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

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

  • $3~/running/ - 在遇到 running 状态的行时 - 打印带有相关 Deployment 名称的行

【讨论】:

  • 非常感谢您的意见 :)
【解决方案2】:

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

注意该操作仅在非空行上执行。

【讨论】:

  • 非常感谢您的意见 :)
【解决方案3】:

您要求使用 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 的主要优势在于它隐式循环每一行并将其拆分为字段。

【讨论】:

  • 非常感谢您的意见 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
相关资源
最近更新 更多