linux - 删除包含在另一个文件中任何位置找到的模式的行

标签 linux bash awk sed grep

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

如果可能的话,我想要一个简单的 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

文件2

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

最佳答案

如果我没理解错的话 您希望从第一个文件中排除与第二个文件中的任何 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)

关于linux - 删除包含在另一个文件中任何位置找到的模式的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47703369/

相关文章:

bash - 使用 GitHub 时防止将大文本文件添加到提交中

linux - 如何将 'stdout' 重定向到 'stderr' 并将 'stderr' 重定向到 'stdout'?

linux - 使用 Linux 删除短于 4 个字符的单词

linux - 如何备份当前的 chkconfig 配置

linux - 如何从jetty webroot文件夹外部访问资源(图像/mp3)?

linux - awk 抛出错误 "wk: cmd. line:1: BEGIN blocks must have an action part"

bash - 在公共(public)列上合并两个文件并使用 awk 打印所有列

linux - 在内部使用AWK命令包装TCL/TK文件

c - Linux内核模块无线接口(interface)比特率

c - 如何用反引号修复 initscr 错误?