寻求有关此任务的帮助。我尝试了几个 shell 脚本来执行此操作,但不确定我是否正确解决了这个问题。我有一个文件,其中包含几个数据块,如下所示:
multipath {
wwid 360000970000195701574533030394530
alias DG_cln_DRPCU04_Oberon_IX_disk59
}
multipath {
wwid 360000970000195701574533030394531
alias DG_cln_DRPCU04_Oberon_IX_disk60
}
multipath {
wwid 360000970000195701574533030394532
alias DG_cln_DRPCU04_Oberon_IX_disk61
}
multipath {
wwid 360000970000195701574533030394533
alias DG_cln_DRPCU04_Oberon_IX_disk62
}
multipath {
wwid 360000970000195701574533030394534
alias DG_cln_DRPCU04_Oberon_IX_disk63
}
multipath {
wwid 360000970000195701574533030394535
alias DG_cln_DRPCU04_Oberon_IX_disk6
}
multipath {
wwid 360000970000195701574533030394536
alias DG_cln_DRPCU04_Oberon_IX_disk64
}
我只想注释掉特定的块。我只想更改块中我已查找到的行。
例子:
grep -B 2 -A 1 DG_cln_DRPCU04_Oberon.
它将返回包含 DG_cln_DRPCU04_Oberon 的每个块。然后我想注释掉返回的每个唯一块的整个 4 行块。有没有简单的方法可以做到这一点?感谢您对如何解决此问题的任何建议。
答案1
您可以在 中执行此操作awk
。将以下脚本放入文件中,然后调用awk -v pattern=disk60 -f script_file data_file
:
found { buf = buf "\n" $0 }
/multipath *\{/ { buf = $0; found = 1 }
!found { print }
$0 ~ pattern { matched = 1 }
/\}/ {
if (matched) {
gsub(/\n/, "\n#", buf);
buf = "#" buf;
}
print buf "\n";
buf = "";
found = matched = 0;
}
其工作原理如下:如果行包含multipath
一个开始的大括号,则启动一个新缓冲区,并设置变量found
。只要found
为真,就将该行添加到缓冲区。如果found
不为真,则立即打印该行,因为我们位于一个有趣的块之外。如果该行与您正在寻找的模式匹配(disk60
在我的示例中),则设置变量matched
。最后,如果行包含一个结束的大括号,则检查是否matched
为真。如果是,则注释掉缓冲区中的行。打印缓冲区并重置变量。