【问题标题】:Grep to match all the patterns from a filegrep 匹配文件中的所有模式
【发布时间】:2015-03-06 10:10:59
【问题描述】:

我在一个文件中有一组模式字符串,我想让grep 找到匹配所有模式的行(逻辑与)。

在我的示例中,我只想找到包含 1 和 2(即 12)的最后一行,但匹配中实际发生的是逻辑 OR,因此返回所有行:

test_file.txt:

1
2
12

pattern.f:

1
2

然后我运行这个命令:

$ grep -f pattern.f test_file.txt
1
2
12

我可以让grep 在一行中做我想做的事吗?我真的不想编写脚本来读取模式匹配文件并循环一堆 grep 或使用管道 (grep 1 test_file.txt | grep 2)。

【问题讨论】:

  • 谢谢,但我实际上并不是在搜索 1 和 2,我只是做了一个简单的测试用例。我实际上正在搜索 icache 和 tagram3 之类的字符串,这些将在 patern.f 文件中,而 test_file.txt 将包含以下行: 24 256 6 1 1.667 # i_cpu2_socwrap - 内存实例 i_europa_top:i_europa_switched_top:i_europa_core:i_cpu2_socwrap:i_m14k_cpu .icache.tagram.tag0:str
  • 使用此数据编辑您的问题。在 cmets 中,代码不容易看懂。
  • 太棒了 :) 完美。谢谢

标签: regex string grep pattern-matching


【解决方案1】:

使用awk 可能会更好:

$ awk 'FNR==NR {a[$1]; next} {for (i in a) if ($1 !~ i) next; print}' patt file
12

这会将模式读入数组a[]。

然后,当读取file 时,它会循环遍历所有模式。如果其中一个与当前行不匹配,则跳到下一行。如果它到达比较的末尾,这意味着该行匹配所有模式,然后打印它。

【讨论】:

  • 谢谢,但我实际上并不是在搜索 1 和 2,我只是做了一个简单的测试用例。我实际上正在搜索 icache 和 tagram3 之类的字符串,这些将在 patern.f 文件中,而 test_file.txt 将包含以下行: 24 256 6 1 1.667 # i_cpu2_socwrap - 内存实例 i_europa_top:i_europa_switched_top:i_europa_core:i_cpu2_socwrap:i_m14k_cpu .icache.tagram.tag0:str
  • 我知道,因此我写了一个通用代码。只有这样才能发布答案,我使用您的输入文件来生成我正在显示的输出。用你的真实数据检查它,看看它是否有效;如果没有,请使用可能缺少的更多信息更新您的问题。 --我看到你在这里发布了很多代码,请这样做,但在问题中,而不是在这里。
  • 好的,抱歉,我对 awk 不熟悉,我以为你是从 1 循环到 2。我试试看
  • 没问题! $1 指的是当前行的第一个字段。稍后我将添加对代码的更广泛的解释。试试看它是否有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
相关资源
最近更新 更多