grep - показать строки до определенного шаблона [duplicate]

У меня есть аналогичная система дома, используемая как многоцелевой медиацентр, сервер, облако, что угодно.

Ubuntu 12.04 LTS, процессор Core i7, оперативная память 8 ГБ, жесткий диск 1 ТБ. Всякий раз, когда я не нахожусь в своем офисе, компьютер блокируется с помощью ctrl + alt + L, используя тот же черный экран, который вы описываете.

Жесткий диск разбился, обновился до 120 ГБ SSD и получил 4 ТБ HDD в обмен на с гарантией 1 ТБ, и заказал еще 8 ГБ оперативной памяти с SSD, ожидая замены накопителя. Установленный Ubuntu 14.04 свежий, такая же сделка: заблокирована, когда нет, никаких проблем.

Я использую Gnome 3 в качестве моего диспетчера дисплеев, не уверен, что вы используете. Единственное заметное различие между нами - ваше приложение «Уолли». Я бы порекомендовал вам полностью отключить его, перезагрузить машину и дать ей примерно неделю или, по крайней мере, пару дней, а затем сообщить нам, все еще продолжается.

1
задан 13 April 2017 в 15:23

2 ответа

Традиционный grep ориентирован на линию. Чтобы выполнять многострочные совпадения, вам нужно либо обмануть его, чтобы вырезать весь файл, указав, что ваш вход завершен нулем, например

grep -zPo '(?s)\nif.*\nendif' file

, либо используйте более гибкий инструмент, такой как pcregrep [!d1 ]

pcregrep -M '(?s)\nif.*?\nendif' file

или perl self

perl -00 -ne 'print if m/^if.*?endif/s' file

В качестве альтернативы для сопоставления структурированного ввода по grep-подобному способу существует sgrep

sgrep '"if" .. ("endif") containing "SOME CODE"' file
6
ответ дан 23 May 2018 в 04:14
  • 1
    AFAIK, пытаясь обмануть grep и др. , указав несуществующий (или даже очень редкий) терминатор, по своей сути является хрупким и не переносимым из-за ограниченного размера буфера линий в различных реализациях. IIRC не нужно беспокоиться, если используете версии GNU, но не все это делают. Во всяком случае, мне кажется, что sed или awk гораздо лучше подходят для такого рода задач, чем нестандартные расширенные grep s или perl: оба кажутся слишком сложными для простого «sed 101» ; такой вопрос, а расширенные grep s, вероятно, одинаково не переносятся. – underscore_d 13 November 2016 в 23:50
  • 2
    @underscore_d Этот сайт посвящен Ubuntu, поэтому переносимость на самом деле не проблема. И узнать больше о том, что может сделать grep или какой-либо другой инструмент, всегда хорошо (даже если просто для удовольствия), не так ли? – Zanna 14 November 2016 в 00:19
  • 3
    @Zanna Я даже не заметил, что это был Ask Ubuntu ... вся SE размывается несколько дней. : D Но небезосновательно полагать, что достаточно людей, которые используют Ubuntu, может быть интересно писать переносную оболочку. И, конечно, не поймите меня неправильно, я думаю, что этот ответ полезен, показывая, как этот мог бы быть выполнен с некоторыми формами grep, но просто хотел отметить некоторые (если теоретические) ограничения и альтернативы. – underscore_d 14 November 2016 в 03:12

Решение awk может выглядеть так: awk '/if/,/endif/' file

Конечно, это похоже на решение с sed.

4
ответ дан 23 May 2018 в 04:14
  • 1
    Да, это тоже работает. Одно из отличий между решением sed и awk: если я заменил file на *, я получаю разные результаты. sed, похоже, ищет только файлы ascii (?) и awk, включая двоичные файлы. – musbach 14 November 2016 в 11:52

Другие вопросы по тегам:

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