我有两个文件:
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
用任意命令替换该语句。
另一方面,如果您知道只想搜索那些固定字符串,那么您也可以使用-f
for 标志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'