Linux Shell 脚本用于更改 grep 中的字符串,然后注释掉文件中找到的字符串上方 2 行和下方 1 行

Linux Shell 脚本用于更改 grep 中的字符串,然后注释掉文件中找到的字符串上方 2 行和下方 1 行

寻求有关此任务的帮助。我尝试了几个 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为真。如果是,则注释掉缓冲区中的行。打印缓冲区并重置变量。

相关内容