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