set_a = set([1,2,3,4])
set_b = set([3,4,5,6])
difference = set_a - set_b
difference{1, 2}
Luozx
2024-08-21 00:00
2024-08-22 00:00
我在工作中,经常遇到这样的问题: 从一个地方抓取数据, 和另外一个地方的数据进行对比, 找出其中的差异. 这很像在求两个集合的差集. 由于大多数时候都面对*nix系统环境, 此时应该首先考虑使用shell工具而不是编程语言(比如python)
因为shell工具更快(谁不喜欢快呢)
以生产Kuberntes集群中的Deployment为标准, 列出验证环境Kuberntes多余的Deployment.
要解决这个问题, 大致分为下面几步:
prod.txtstaging.txtstaging.txt - prod.txt每个文件里的内容大概是这样的, 每一行是一个Deployment的名称:
prod.txt
唯一不同的是staging.txt里的内容比prod.txt多一些:
要得到staging.txt比prod.txt多出的部分, 计算staging.txt和prod.txt的差集1是一个符合直觉的做法.
在Python中可以用set来表示集合, 用-来求差集:
使用Python完全可以胜任,但是使用*nix环境给你提供的默认工具, 会让这个问题得以优雅的解决.
grep 是Linux环境下最常见和常用的过滤工具, 我之前没有意识到他在处理这个问题上可以这么优雅.
三个参数:
-v : 反向匹配, 即只匹配不包含的行-F : 以固定字符串而不是正则表达式进行匹配-f : 从文件中读取匹配模式也就是: 从staging.txt中匹配不包含在prod.txt中的行. 即staging.txt比prod.txt多出的部分.
三个参数中, -v 也许是我使用最多的,因为在筛选某些进程的进程(号)时,并不希望看到grep本身进程的进程(号).
两个集合的差集: A - B = A里有而B里没有的元素↩︎