是否可以编写脚本来检查配置文件中两种模式之间的差异

是否可以编写脚本来检查配置文件中两种模式之间的差异

Linux。例如,我有两个配置文件。第一个:

    criticalexceptions => [
    'yum-updatesd-helper: error',
    'cups: cupsd shutdown succeeded',
    'hda: drive_cmd: error',
    'end_request: I\/O error, dev fd0',
    'SAP[A-Z0-9]{3}_[0-9]{2}\[[0-9]+\]',
    'nrpe\[[0-9]+\]:',
    'collectd\[[0-9]+\]:',
    'kernel: cdrom: open failed',
    'gconfd.*Failed',
    'nrpe.*ERROR.*seteuid(0): Operation not permitted',
],
criticalpatterns => [
    'kernel: Kernel BUG',
    'error',
    'critical',
    'failed',
    'warning',
    'HACMP',
    'shutdown',
    'panic',
    'exiting',
],

第二

    criticalexceptions => [
    'as-ncs01 logger:',
    'logger: NetWorker media:',
    'warning while saving',
    'could not be opened and was not backed up',
    'NetWorker',
    'zmd:',
    'Succeeded with warning',
    'failed - POSSIBLE BREAKIN ATTEMPT!',
    'JBD: barrier-based sync failed on',
    'cmaeventd\[.*\]\: Logical drive [0-9] of Array Controller in slot',
    'end_request: I\/O error, dev fd0',
    'logrotate: error: unable to open \/var\/log\/sudosh',
    'logrotate: error: failed to rename \/var\/log\/sudosh',
    'smbd',
    'sap2.* winbindd\[\d{0,}\]\:   cli_rpc_pipe_open_schannel\: failed to get schannel session',
    'suse_register\[\d+\]:',
    'SAP[a-zA-Z0-9#]{3}_[0-9#]{2}\[[0-9]+\]',
    'nrpe\[[0-9]+\]:',
    'collectd\[[0-9]+\]:',
    'kernel: cdrom: open failed',
    'smartd\[[0-9]+\]:',
    'modprobe:.+Error inserting floppy',
    'saposcol\[[0-9]+\]:.+segfault at',
    'sapccm4x\[[0-9]+\]:.+segfault at',
    'XMLForm\[[0-9]+\]:',
    'sapxpg\[[0-9]+\]:',
    '\[Hardware Error\]: Machine check events logged',
    'snowagent:.+Could not parse time format', #9001208224

],
criticalpatterns => [
    'kernel: Kernel BUG',
    'error',
    'critical',
    'failed',
    'warning',
    'HACMP',
    'shutdown',
    'panic',
    'exiting',
    'link status definitely',
    'Link is (Down|Up)',
],

是否可以编写脚本来检查这两个配置文件中两种模式之间的差异? 带示例的屏幕

答案1

您已经得到了并排的差异,但不清楚您希望脚本做什么。

Diff 无法很好地处理此类数据,因此您需要做的第一件事就是将其展平,使每一行都描述结构。然后您可以对其进行排序并对其进行 diff。

flatten() {
  echo "$*"
  awk '
    /^\]/ { arr = "" }
    arr != "" && NF { sub(/^[[:space:]]+/, ""); print arr $0 }
    $2 $3 == "=>[" { arr = $1 $2 }
  ' "$@" |sort
}

gvimdiff <(flatten /tmp/a) <(flatten /tmp/b)

我定义了一个flatten函数,用于awk展平文件中的数据。为了记住我们在哪个文件上,该函数在顶部打印参数(文件)。然后我们运行awk。对于以开头的行],我们关闭了一个结构。清空变量arr。如果有一个非空arr变量并且行不为空(字段数不为零),请删除前导空格并以arr变量的内容为前缀打印它。如果第二和第三个字段连接到,=>[那么我们就启动了一个数组。将数组名称和保存在变量=>arr。然后我们对输出进行排序。

现在我们可以进行更具信息量的比较。我没有使用临时文件,而是使用 bash 技术将两个 flatten 命令的输出直接导入到diff

我跑步是gvimdiff因为这是我自己的习惯:

gvimdiff 输出

您还可以运行diff -u <(flatten /tmp/a) <(flatten /tmp/b) |grep '^-'来获取已删除的线条等等。

相关内容