1

有一个更好的方法吗?我正在生成一个安装在我的 linux 系统上的应用程序列表APPLIST。然后我想检查它们是否在WHITELIST允许的应用程序中。如果不将它们打印到另一个文件中。我很快想出了下面的内容,但想知道我是否可以比这样的循环更有效地做到这一点。

rpm -qa --queryformat '[%{NAME}\n]' > ${APPLIST}    
while read app; do
    grep -R "${app}" ${WHITELIST} > /dev/null 2>&1 || echo ${app} >> ${TMPLIST}
done < ${APPLIST}

完成后,白名单中没有的内容现在都在TMPLIST文件中。

我试图在没有运气的情况下使用它:

diff --changed-group-format='%>' --unchanged-group-format='' ${WHITELIST} ${APPLIST} > ${TMPLIST}
4

2 回答 2

0

要构建第一个列表,请使用sort

rpm -qa --queryformat '[%{NAME}\n]' | sort > ${APPLIST}

然后确保您的白名单也已排序,并diff在它们上运行以获得结果。

diff ${APPLIST} ${WHITELIST} > ${TMPLIST}

编辑

我意识到我的原始答案并没有产生所需的包名称列表,而是带有>、<字符等的典型diff格式。做了一点挖掘,在超级用户上找到了这个线程,与你的问题非常相似。

原来你的问题可以完全解决diff(假设排序列表)。所以借用sort@rob mayoff 的 subshel​​l 魔法和 Superuserdiff线程的标志,这是你的两行diff解决方案

rpm -qa --queryformat '[%{NAME}\n]' | sort > ${APPLIST}
diff --changed-group-format='%>' --unchanged-group-format='' ${APPLIST} <(sort ${WHITELIST}) > ${TMPLIST}
于 2013-10-16T20:29:12.600 回答
0

join命令可以采用两个排序列表并打印一个列表中但不在另一个列表中的元素。

rpm -qa --queryformat '[%{NAME}\n]' | sort > ${APPLIST}
join -v 1 ${APPLIST} <(sort ${WHITELIST}) > ${TMPLIST}
于 2013-10-16T20:42:05.527 回答