Распечатайте строку, только если следующая строка НЕ содержит особое соответствие

Почему Вы не думаете о Fedora? Возможно, Вы думаете, что это не может быть установлено с единственным CD? Это всегда была опция, для установки Fedora от первого ISO в ряду. Это было довольно вводящим в заблуждение, но если Вы читаете описание достаточно тщательно существует текст, в котором говорится что-то как, "Только первый CD требуется, остальные - просто дополнительное программное обеспечение".

В Fedora 14, однако, решен беспорядок, потому что веб-сайт делает его довольно ясным, что Вы устанавливаете Fedora с помощью одного CD только. Я предполагаю, что можно все еще получить остальную часть CD в ряду где-нибудь, но я не думаю, что Вы когда-либо должны будете.

Обновление: я не уверен в /etc/init.d или /etc/profile.d, но Fedora должен быть самой близкой вещью к RHEL, исключая сам RHEL.

12
30.07.2012, 17:22
4 ответа

Вот awk альтернатива:

awk '
  /^Starting/ { I[$5] = $0                  }
  /^ID/       { delete I[$2]                }
  END         { for (key in I) print I[key] }
' infile

Вывод:

Starting activity for ID 33367

I ассоциативный массив отслеживает то, какие идентификаторы были замечены.

10
27.01.2020, 19:55
  • 1
    Это работает действительно хорошо, поскольку это даже, кажется, размещает ситуации, где "Запуск..." и "Завершенный..." строки журнала не смежен/последователен. Спасибо @Thor! –  PattMauler 30.07.2012, 21:23
  • 2
    Ваше приветствие. Это должно работать эффективно (почти) с произвольным входом размера, поскольку он только когда-либо хранит идентификатор, и время поиска является O (1). –  Thor 30.07.2012, 23:21
  • 3
    Хороший. Только одна вещь: как я узнал из @RobertL (unix.stackexchange.com/a/243550/135943), Вы не должны присваивать значение для создания элемента массива. Таким образом вместо I[$5] = 1, можно просто использовать I[$5]. (Вы не заботитесь о значении, Вы просто хотите заставить элемент существовать, и просто именование его выполняет это.) –  Wildcard 09.12.2015, 03:29
  • 4
    @Wildcard: Вы правы, но после рассмотрения вопроса OP и grep любят, производит, он после, более уместно помнить целую строку и произвести это в конце. –  Thor 09.12.2015, 15:51

если Ваша установка поддерживает pcregrep, мультилиния (-M) опция пригождается.

pcregrep -M -o '\AStarting activity for ID (\d+)\n(?!ID \1)' t.z

Стартовое действие для идентификатора 33367

1
27.01.2020, 19:55

Вот то, как Вы могли сделать это с GNU sed:

sed -r 'N; /([0-9]+)\n\w+\s+\1/d; P; D' infile
  • N читает еще одну строку в пространство шаблона.
  • Соответствие regex проверяет, найдены ли идентичные идентификаторы, раз так пространство шаблона удалено (d) и цикл перезапущен.
  • Если это не соответствовало, распечатайте первую строку в пространстве шаблона (P) и удалите его (D).
2
27.01.2020, 19:55
  • 1
    я ничего не вижу, расширился здесь... так -r не необходим, правильно? –  Louis Maddox 26.10.2014, 21:49
  • 2
    @lmmx: Это необходимо, потому что иначе группы получения нужно оставить, и то же идет для + квантор. –  Thor 27.10.2014, 18:41
  • 3
    хорошо! Я изменил его и был сказан, что это не было необходимо, благодарит разъясниться –  Louis Maddox 27.10.2014, 23:19
sed '$!N;/\n.*completed/d;P;D' <input

Это удалит из вывода все входные строки, за которыми не следует строка, соответствующая строке завершено .

3
27.01.2020, 19:55

Теги

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