使用 bash 脚本显示配置文件中不在另一个配置中的指令(按行)

Display directives (in lines) from config file that aren't in an another config using bash scripting

有类似的问题,但这是具体的,我的 awk 知识一点也不好(尽管你可以使用任何工具来解决这个问题)。 所以,我正在使用 OpenWRT 配置文件。第一个文件看起来像这样(这是我构建的初始配置(一部分)):

# Use "make defconfig" to expand this to a full .config

# Selecting target and model(s)
CONFIG_TARGET_ar71xx=y
CONFIG_TARGET_ar71xx_generic_ARCHERC7=y

CONFIG_PACKAGE_luci-ssl=y

# we do not need these, since it adds more dependencies
#CONFIG_PACKAGE_mc=y

如您所见,指令(例如'CONFIG_PACKAGE_luci-ssl')通常在此文件中具有值(但这无关紧要),但它们可以被注释掉,并且可以是其中的空行。 假设第二个配置文件如下所示(只是一个基本的完整配置):

#
# Automatically generated file; DO NOT EDIT.
# OpenWrt Configuration
#
CONFIG_MODULES=y
CONFIG_HAVE_DOT_CONFIG=y
# CONFIG_TARGET_ppc40x is not set
# CONFIG_TARGET_realview is not set
# CONFIG_TARGET_atheros is not set
CONFIG_TARGET_ar71xx=y
# CONFIG_TARGET_ar71xx_generic_ARCHERC7 is not set

在第二个配置中,指令通常没有值(这些时候它们被注释掉了)但有时它们可​​以有。

我想显示第一个文件中根本不在第二个文件中的所有未注释指令(有或没有它们的值(无关紧要)),无论它们被注释掉还是未注释掉。 在这个例子中它只会显示:

CONFIG_PACKAGE_luci-ssl

有一个初始配置文件很好,当您升级到另一个版本时,您可以轻松测试您的配置是否可以用于该版本(是否有任何缺失的设置)。 谢谢!

假设文件名为 1st2nd,这是一种可能性:

grep -vf<(echo ^#;echo ^$;sed -n 's/.*=y/^&/p;s/# \(.*\) is not set/^=/p' 2nd) 1st

<( ) 之间的命令生成在 1st 中搜索的模式列表:

  • ^# 行以 #
  • 开头
  • ^$ 行开始和立即结束,i。 e.空
  • ^.*= 行以来自 2nd
  • 的指令开头

由于选项 -v,这些匹配行没有显示,留下了想要的非匹配行。

FILE1="../configs/init.config"; FILE2=".config"; grep -v "^#" "$FILE1" | grep -v "^$" | grep -F -x -v -f "$FILE2" -