Grep с диапазоном и пропуском трех фильтров

Убедитесь, что у вас установлены пакеты nvidia и nvidia-libgl из официальных репозиториев. Кроме того, mesa-libgl плохо работает ни с одним из этих пакетов, поэтому убедитесь, что этот пакет не установлен.

2
26.02.2017, 16:44
4 ответа

Использование awk :

$ awk 'BEGIN{RS="-------------"};/KEY:ZZ/&&/ord:chandru/{print RS$0}' sample.txt|egrep -v "^ *$"

Вывод:

-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:Z    
-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
0
27.01.2020, 21:59

Это должно быть довольно надежно

$ sed -n '1p; /ord:chandru/ {             
N                                           
N
/KEY:ZZ/{
N
/ord:chandru.*\n.*\n.*KEY:ZZ.*\n---.*/p
}
}' file

Объяснение

  • -n не печатайте, пока мы не попросим что-то
  • 1p напечатайте первую строку, предполагая, что это даст нам строку дефисов (после этого мы печатаем только завершающие строки дефисов)
  • / ord: chandru / найти шаблон
  • N прочитать следующий строка, чтобы мы могли использовать символ \ n для представления новой строки
  • p напечатайте совпадающие строки
1
27.01.2020, 21:59

Если у вас есть GNU awk Я бы предложил что-то вроде этого:

gawk 'BEGIN{RS="-+\n"} $0=="" || /ord:chandru/ && /KEY:ZZ/ {ORS=RT; print}' sample.txt
-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
-------------

$ 0 == "" просто принудительно печатает пустые записи (именно так будет интерпретироваться первая строка вашего файла, если вы считаете, записи должны быть разделены строками дефисов).


Если у вас нет gawk , то на самом деле единственная разница состоит в том, что вы не можете легко захватить разделитель записей - в приведенном вами примере это не так уж и много проблема, поскольку это фиксированная строка. Так, например, с mawk :

mawk 'BEGIN{RS="-------------\n"; ORS=RS} $0=="" || /ord:chandru/ && /KEY:ZZ/ {print}' sample.txt
-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
-------------
3
27.01.2020, 21:59
sed -e '
   /^ord:/,/^--*$/!b
   H; /^ord:/h
   /^--*$/!d; g
   /^ord:chandru[ ]/!d
   /\n[ ]*KEY:ZZ\n--*$/!d
'  sample.txt

Краткое содержание: /../,/../ => - оператор диапазона для выбора диапазона строк, например, в вашем случае от / ord: / до / ---- / .

Мы перемещаем эти диапазоны (диапазон за раз) в зону трюма. Затем, когда мы находимся в конце диапазона / --- / , мы знаем, что пришло время выбрать или отклонить этот конкретный диапазон на основе критериев, которые `a) / ord: chandru / && b ) / ключ: ZZ / '

0
27.01.2020, 21:59

Теги

Похожие вопросы