Shell 如何使用sed/awk命令剪切字符串并附加到后续行?
需要您的帮助来解决我在编写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命令实现: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
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/
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 != ""
这需要注意操作只在非空的行上执行 你为自己做了什么?将你的研究成果发布到这个问题上,即使它不成功,也可能重复“非常感谢你的投入:)你为自己做了什么?把你的研究成果贴到这个问题上,即使它不成功,也可能重复以下内容:)非常感谢你的投入:)非常感谢你的投入:)非常感谢你的投入:)非常感谢你的投入:)非常感谢你的投入:)非常感谢你的投入:)非常感谢你的投入:)