在编写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命令实现
答案 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的主要优势在于它隐含地遍历每一行并将其分成字段。