2013-10-16 40 views
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} 
+0

按排序顺序存储列表,然后对它们运行'diff'? – quickshiftin

回答

0

打造的第一个列表使用sort

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

然后确保你的白名单中的排序为好,并在上面运行diff为结果。

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

编辑

我意识到我原来的答复不会产生只是包名的所需的列表,而是一个典型的diff格式>,<字符等。做了一点挖掘,发现超级用户this thread,与您的问题非常相似。

原来你的问题可以完全用diff(假设排序列表)来解决。所以,借款子shell从@rob mayoff sort魔术和来自超级用户线程diff标志,这里是你的两班轮diff解决方案

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

join命令可以采取两种排序列表和打印在一个列表中的元素但不在其他。

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