【问题标题】:Grep with multiple keywords and output multiple lines使用多个关键字进行grep并输出多行
【发布时间】:2017-01-27 12:48:51
【问题描述】:

我想 grep 行包含所有 3 种不同的模式,并将它们与 2 前行和 1 下一行一起输出。

这是我可以在没有多行输出的情况下使用 grep 的命令。现在我想添加上面提到的 3 行。我可以把-A和-B放在一起吗?还是我必须使用-C?我应该把这些选项放在哪里,全部放在三个条件或第一个或最后一个?

grep -e Melon -e Banana -e Lemon *txt | grep Tomato | grep Milk

这是样本输入

Egg Tomato    
Salad Coffee
Melon Tomato Milk
Noodle Salmon
Banana Potato Milk
Salmon Rice

预期输出是

Egg Tomato 
Salad Coffee
Melon Tomato Milk
Noodle Salmon

【问题讨论】:

  • 请包含示例inputexpected 数据
  • @ Jose Ricardo Bustos M. 我添加了输入和预期输出
  • 为什么Banana Potato Milk 不在预期输出中?另外,这里的逻辑是什么?您想要包含 Melon、Banan 和 Lemon 或所有这些的行吗?
  • 因为“grep Tomato”。我要写的命令是“(Melon or Banana or Lemon) and Tomato and Milk”番茄和牛奶都必须在行中。
  • -E 选项,将 PATTERN 解释为扩展正则表达式

标签: linux grep


【解决方案1】:

一个大的解决方案,你想要:上面两行和下面一行模式:(Melon or Banana or Lemon) and Tomato and Milk

grep -A1 -B2 -E -e "(Tomato.*Milk|Milk.*Tomato).*(Melon|Banana|Lemon)" \
                -e "(Melon|Banana|Lemon).*(Tomato.*Milk|Milk.*Tomato)" \
                -e "Tomato.*(Melon|Banana|Lemon).*Milk" \
                -e "Milk.*(Melon|Banana|Lemon).*Tomato" *txt

仅供娱乐

使用awk的另一种解决方案

awk '
    flag{print; flag=0}
    /Melon|Banana|Lemon/ && /Milk/ && /Tomato/{
        printf "%s\n%s\n%s\n",prev[0],prev[1],$0
        flag=1; next
    }
    {prev[0]=prev[1]; prev[1]=$0}' *txt

【讨论】:

  • 是的,我可以 grep 正是我想要的!非常感谢您的帮助。我以为会有一些简单的方法,但似乎没有。
猜你喜欢
  • 2019-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 2018-01-08
  • 2021-08-23
  • 2014-12-11
  • 2013-04-11
相关资源
最近更新 更多