将文件中所有不存在于管道输入中的行输出到grep

时间:2015-11-25 17:36:13

标签: shell grep

我想获得一个安装的Atom软件包列表,与packages.txt中存储的固定软件包列表进行比较:

highlight-selected@0.11.1
ruby-block@0.3.5

要获取已安装的软件包列表,我使用apm list --installed --bare

highlight-selected@0.11.1

所以,我会得到ruby-block@0.3.5包,因为那是packages.txt中列出的并且未安装的包。

我尝试过类似的事情:

apm list --installed --bare | grep -v -f packages.txt

但它不起作用。我应该如何调整命令以达到我的目的?

2 个答案:

答案 0 :(得分:2)

-v打印输入中与模式文件中的任何模式都不匹配的行。您希望文件中的反转线与输入不匹配。实现此目的的方法是切换输入和模式。您还需要从输出中删除任何空行:

grep -v -f <(apm list --installed --bare | sed '/^$/d') packages.txt

例如:

% cat packages.txt
highlight-selected@0.11.1
ruby-block@0.3.5
% cat installed
highlight-selected@0.11.1
% grep -vf installed packages.txt
2:ruby-block@0.3.5

这应该适用于所有的greps; gnu grep应该让你直接使用stdin作为模式文件:

apm list --installed --bare | sed '/^$/d' | grep -v -f - packages.txt

答案 1 :(得分:1)

管道输出保存为临时文件会更容易,例如使用以下语法:

$ grep -v -f <(apm list --installed --bare) packages.txt