2017-02-02 14 views
0

Один из моего сценария будет возвращать выход, как показано ниже,Баш Grep для строки и игнорировать выше одной линии

NameComponent=Apache 
Fixed=False 
NameComponent=MySQL 
Fixed=True 

Таким образом, в приведенном выше выводе, я пытаюсь игнорировать ниже вывода с помощью Grep grep -vB1 'False', который, кажется, не работает ,

NameComponent=Apache 
Fixed=False 

можно ли выполнить это с помощью Grep или лучше способ с AWK ..

ответ

1
<some-command> |tac |sed -e '/False/ { N; d}' |tac 
NameComponent=MySQL 
Fixed=True 

Для каждой строки, которая соответствует "False", код в {} запускается на выполнение. N также переносит следующую строку в пространство шаблонов, а затем d удаляет все, прежде чем перейти к следующей строке. Примечание: использование нескольких pipes не считается хорошей практикой.

0

@ Karthi1234: Если input_file такое же, как это предусмотрено образцов попробуйте:

awk -F' |=' '($2 != "Apache" && $2 != "False")' Input_file 

Первых делая разделитель полей в пространстве или = затем проверить здесь, если значение поля 2-й не равно жалить Apache и Ложное и упоминается никаких действий, которые будут выполнены так по умолчанию действия печати будет сделано AWK ,

EDIT: согласно запросу OP в следующем является код изменен один, попробуйте:

awk '!/Apache/ && !/False/' Input_file 

Вы можете изменить строки также в случае, если это не те, которые вы хотите, логика должна быть такой же.

EDIT2: eg -> Вы можете изменять значения string1 и string2 и при необходимости увеличивать условия в соответствии с вашими требованиями.

awk '!/string1/ && !/string2/' Input_file 
+0

Но проблема в том, что $ 2 будет отличаться. Я ищу общий способ, просто используя ключевое слово '' False ''. – Karthi1234

+0

@ Karthi1234: Отредактировав свой ответ, попросите вас быть немного более ясными в ваших вопросах, сообщите мне, если у вас есть какие-либо вопросы. – RavinderSingh13

0

Если я правильно понял вопрос правильно, вы всегда будете иметь строку перед «Fixed = ...» и вы хотите напечатать обе строки, если и только если «Fixed = True»

Следующая awk следует сделать трюк:

<command> | awk 'BEGIN {prev='NA'} {if ($0=="Fixed=True") {print prev; print $0;} prev=$0;}' 

Обратите внимание, что если первая строка «Fixed = True», он будет печатать строку «NA» в качестве первой линии.