删除包含在另一个文件中找到的模式的行

时间:2017-12-07 20:38:14

标签: linux bash awk sed grep

如果它们包含在file2中找到的模式,我想比较两个文件并删除file1中的行。我做了一些搜索,我能找到的最接近的答案是如何删除出现在另一个文件中的行。

如果可能的话,我喜欢简单的grep,awk,sed等。我在IP地址上进行匹配,如下所示。

文件1

10.10.50.1 00:00:10:23 0000.0012.3456 Vlan1
10.10.50.2 00:00:12:34 1234.56AB.CDEF Vlan2
10.10.50.3 00:00:23:10 ABCD.EF12.345 Vlan3billion

file2的

these-are some_words 10.10.50.2 andmaybe some-other words
theseare somewords 10.10.50.99 and-maybe some_other words

预期产出:

10.10.50.1 00:00:10:23 0000.0012.3456 Vlan1
10.10.50.3 00:00:23:10 ABCD.EF12.345 Vlan3billion

3 个答案:

答案 0 :(得分:1)

如果我理解正确, 您希望从第一个与第二个文件中的任何IP地址匹配的文件行中排除。

这个简单且无可否认的有点懒惰的解决方案可能足以满足您的目的:

grep -v file1 -Fwf <(awk '{ print $3 }' file2)

Awk用IP地址提取第3列, 并且grep会将这些用作固定模式(-F),并且只匹配完整的字词(-w)。

如果IP地址不总是第3列, 那么你可以通过使用与grep的模式匹配来提取它们, 如@tripleee所示:

grep -v file1 -Fwf <(grep -owE '[1-9][0-9](\.[0-9]{1,3}){3}' file2)

答案 1 :(得分:0)

awk救援!

$ awk 'NR==FNR{a[$3];next} !($1 in a)' file2 file1

10.10.50.1 00:00:10:23 0000.0012.3456 Vlan1
10.10.50.3 00:00:23:10 ABCD.EF12.345 Vlan3billion

答案 2 :(得分:0)

更多awk ......核心从karafka挣扎出来..

$ awk 'NR==FNR{a[gensub(/^.* (([0-9]{1,3}\.){3}[0-9]{1,3}) .*$/,"\\1",1,$0)];next} !($1 in a)' file2 file1
10.10.50.1 00:00:10:23 0000.0012.3456 Vlan1
10.10.50.3 00:00:23:10 ABCD.EF12.345 Vlan3billion