comm不匹配两个具有相同元素的日志文件

时间:2018-02-18 03:35:09

标签: linux comm

我正在尝试使用comm命令比较两个日志,以查看哪些应用已安装但未删除。这是文件的例子:

安装的:

2009-03-21 11:43:21 install flex-old:amd54 <none> 3.7.4a-10ubuntu1
2009-03-22 22:55:08 install libubsan0:amd54 <none> 6.3.0-1ubuntu1~14.04

移除:

2009-03-24 19:53:49 remove libubsan0:amd54 <none> 6.3.0-1ubuntu1~14.04

因此需要发现不同的是“flex-old”行。这是我尝试过的,还有其他一些变化:

comm -23 <(sort install.txt) <(sort removed.txt) > difference.txt

这将输出所有已安装的列表,而不仅仅是与删除列表不相同的列表。我也试过了:

comm -3 <(sort install.txt | uniq) <(sort removed.txt | uniq) > what.txt

但是,这会输出两者中的所有应用,但直接在安装下删除。 任何帮助表示赞赏:)

2 个答案:

答案 0 :(得分:1)

您需要过滤您的内容,以便只将实际上相同的部分提供给comm

  • 时间戳(第一列和第二列)在显示的示例输入的两个文件之间永远不会相同。

  • 显示的示例输入的两个文件之间的installremove行永远不会相同。

由于此输入在两个文件之间实际上没有任何相同的行,因此问题中描述的输出完全正确。

只发出可能相同的有意义的列,我们最终得到:

comm -23 <(awk '{ print $4 " " $6 }' <install.txt | sort) \
         <(awk '{ print $4 " " $6 }' <removed.txt | sort)

https://ideone.com/IheVRL看到这个运行,并正确地只发出(正确的)输出:

flex-old:amd54 3.7.4a-10ubuntu1

答案 1 :(得分:0)

您可以尝试http://stromberg.dnsalias.org/~strombrg/set-arithmetic/

我发现它比comm更容易,也更强大。它不需要任何排序。

完全披露:我写了。

HTH。