尝试使用 diff 输出与单独的文件进行比较

尝试使用 diff 输出与单独的文件进行比较

我有两个文件:

smw:/working/iso_testing # cat a
QConvergeConsoleCLI-1.1.03-49.x86_64.rpm
aaa_base-13.2+git20140911.61c1681-1.3.i586.rpm
acpica-20140724-2.1.2.i586.rpm
test.rpm

smw:/working/iso_testing # cat b
QConvergeConsoleCLI-1.1.03-49.x86_64.rpm
aaa_base-13.2+git20140911.61c1681-1.3.i586.rpm
acpica-20140724-2.1.2.i586.rpm

--如果我比较它们,我会看到:

smw:/working/iso_testing # diff a b
4d3
< test.rpm

我想获取该输出(test.rpm)并将其从第三个文件中 grep 出来。又名文件 c:

smw:/working/iso_testing # cat c
QConvergeConsoleCLI QConvergeConsoleCLI-1.1.03-49.x86_64.rpm
aaa_base aaa_base-13.2+git20140911.61c1681-1.3.i586.rpm
acpica acpica-20140724-2.1.2.i586.rpm
test test.rpm

我想要的输出看起来像

test test.rpm

也许我一开始就有很多文件,但我被困住了。提前致谢

文件 A 是来自一个存储库的 rpm 列表,文件 B 是来自 .csv 文件的 rpm 列表,文件 C 是文件 B 的副本,但包含软件包名称,而不仅仅是 rpm。***

答案1

这是 TLDR 解决方案:

for line in "$(diff a b | sed -n 's/^< //p')"; do grep "${line}" c; done

下面是更详细的解释。


您要做的第一件事可能是清理命令的输出diff并提取您想要搜索的字符串。

根据您的示例,您似乎想要仅出现在第一个文件(例如文件“a”)中的行。

以下命令返回第一个文件中的行并删除“<”前缀:

diff <(diff a b | sed -n 's/^< //p')

现在您可以为每一行循环处理清理后的 diff 和 grep,例如:

for line in "$(diff a b | sed -n 's/^< //p')"; do grep "${line}" c; done

这种方法的优点是非常灵活,因为您可以grep用任意命令替换该语句。

另一方面,如果您知道只想搜索那些固定字符串,那么您也可以使用-ffor 标志grep而不是使用 for 循环:

grep -f <(diff a b | sed -n 's/^< //p') c

diff另一种选择是第二次调用:

diff <(diff a b | sed -n 's/^< //p') c

然后,您可以以类似的方式处理此输出:

diff <(diff a b | sed -n 's/^< //p') c | sed -n 's/^< //p'

相关内容