通过比较两个文件创建列表

时间:2013-10-16 20:22:40

标签: bash

有更好的方法吗?我正在生成一个安装在我的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}

2 个答案:

答案 0 :(得分:0)

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

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

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

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

修改

我意识到我的原始答案不会产生所需的包名称列表,而是具有&gt;,&lt; 字符等的典型diff格式。在Superuser上进行了一些挖掘并找到this thread,与您的问题非常相似。

原来你的问题可以通过diff完全解决(假设排序列表)。所以借用@rob mayoff中的子shell sort魔法和超级用户线程中的diff标志,这是你的双线diff解决方案

rpm -qa --queryformat '[%{NAME}\n]' | sort > ${APPLIST}
diff --changed-group-format='%>' --unchanged-group-format='' ${APPLIST} <(sort ${WHITELIST}) > ${TMPLIST}

答案 1 :(得分:0)

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

rpm -qa --queryformat '[%{NAME}\n]' | sort > ${APPLIST}
join -v 1 ${APPLIST} <(sort ${WHITELIST}) > ${TMPLIST}