У меня огромный лог-файл, и я хочу найти текст «исключение, сгенерированный ::» в конце файла и получить оттуда еще пару символов. В основном меня интересует только последнее появление.

например, если файл журнала похож

исключение некоторых данных, вызванное :: classA, еще несколько текстовых исключений, созданное :: classBB; некоторые другие журналы; недавние исключения, вызванные :: classX.

Я хочу найти и распечатать исключение, сгенерированное :: classX

Пожалуйста, помогите.

3 ответа3

1

SED решение

sed '/:: classX/h;$!d' logfile

sed сопоставляет шаблон и помещает строку в буфер хранения h затем удаляет все строки, кроме последней строки $!d

1

Попробуй это. Сначала мы переворачиваем файл построчно, затем переворачиваем каждую строку. Затем найдите обратную сторону «исключения, сгенерированного ::», затем напечатайте первое совпадение. И, наконец, полностью изменить это.

tac logfile.txt | rev | grep -Po '\w+\s+::\s+yb\s+werht\s+noitpecxe'  | head -1 | rev

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

1

Будет выполнен поиск текста, который вы хотите $TEXT в файле log data.txt , покажет X строк до и Y строк после совпадения. Команда tail отфильтрует все, кроме последнего совпадения. Число, используемое в tail команде: Z, а Z = X + Y + 1

grep -BX -AY "$TEXT" data.txt | tail -Z

Так, например, если вы хотите найти :: classX , вы хотите одну строку до и 5 строк после, то вы бы запустили

grep -B1 -A5 ':: classX' data.txt | tail -7

В качестве примечания, если вы хотите первый матч, вы можете заменить tail head . Если вы хотите увидеть все совпадения, удалите | tail -Z часть.

Вы можете добавить соответствие цветов также с помощью grep --color

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .