Я пытаюсь найти в файле журнала действия, которые не были завершены. Например, я регистрирую «Начальное действие для идентификатора 1234 ...», и в случае успеха следующая строка будет «Задание 1234 выполнено».
Я пытаюсь получить строки "Starting ...", за которыми НЕ следуют соответствующие строки "Completed".
Пример файла журнала
Starting activity for ID 1234
ID 1234 completed successfully
Starting activity for ID 3423
ID 3423 completed successfully
Starting activity for ID 9876
ID 9876 completed successfully
Starting activity for ID 99889
ID 99889 completed successfully
Starting activity for ID 10011
ID 10011 completed successfully
Starting activity for ID 33367
Starting activity for ID 936819
ID 936819 completed successfully
В этом примере я бы искал вывод:
Starting activity for ID 33367
... потому что за ним не следует "завершенная" строка.
Я пытался сделать это с grep
и awk
, но не имел большого успеха. Я предполагаю, что это можно сделать с помощью одного из этих инструментов, но мои grep
и awk
отбивные не продвинулись.
Ищу быстрый и надежный grep
или awk
шаблон, чтобы дать результаты, которые мне нужны здесь.
Ответы:
Вот
awk
альтернатива:Выход:
I
Ассоциативный массив отслеживает то , что идентификаторы были замечены.источник
I[$5] = 1
, вы можете просто использоватьI[$5]
. (Вы не заботитесь о значении, вы просто хотите, чтобы элемент существовал , и просто называете его, и это достигается.)Это приведет к удалению с выхода всех линий ввода , которые не следуют линии , соответствующей строки завершено .
источник
Вот как вы можете сделать это с помощью GNU sed:
N
читает еще одну строку в шаблонном пространстве.d
) и цикл перезапускается.P
) и удалите его (D
).источник
-r
что не нужно, верно?+
квантификатора.если ваша установка поддерживает pcregrep, вам пригодится опция multiline (-M).
Начало активности для ID 33367
источник