![](/img/trans.png)
[英]How to use cut and awk commands to extract text input in a tabular format?
[英]How to use sed/awk commands to cut a string and append to the succeeding lines?
在编写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命令实现
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/
-在遇到具有运行状态的行时-打印具有相关部署名称的行
这是另一个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 != ""
这要注意,该操作仅在不为空的行上执行。
您要求使用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的主要优势在于,它隐式循环遍历每行并将其拆分为多个字段。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.