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
因为这是我自己的习惯:
您还可以运行diff -u <(flatten /tmp/a) <(flatten /tmp/b) |grep '^-'
来获取已删除的线条等等。