2017-01-27 11 views
1

Я хочу, чтобы строки grep содержали все 3 разных шаблона и выводили их с двумя предыдущими строками и 1 следующей строкой.Grep с несколькими ключевыми словами и выводами нескольких строк

Это команда, которую я мог бы 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 
+0

Пожалуйста, включите пример '' input' и данные expected' –

+0

@ Хосе Рикардо Бустос М. я добавил вход и ожидаемый результат –

+1

почему не 'Banana «Картофельное молоко» в ожидаемом продукте? Кроме того, что здесь является логикой? Вам нужны строки, содержащие любую из дыни, банана и лимона или все из них? – fedorqui

ответ

2

Большое решение, вы хотите: две линии выше и одна линия ниже рисунка: (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 
+0

Да, я мог бы grep именно то, что я хотел! Большое спасибо за Вашу помощь. Я думал, что будет какой-то простой способ, но, похоже, нет. –