Интеллектуальное “Вычитание” одного текстового файла журнала от другого

Пример: Приложение генерирует файл журнала крупного текста A со многими различными сообщениями. Это генерирует столь же большой файл журнала B когда не функционирует правильно.

Я хочу видеть что сообщения в файле B являются чрезвычайно новыми, т.е. отфильтровывать все от A.

Тривиальный прототип:

  1. Вид | uniq оба файла
  2. Файлы соединения
  3. вид | uniq-c
  4. grep-v "^2"

Это производит симметричное различие и неудобный. Как сделать это лучше? (включая несимметричное различие и сохранение сообщений заказывают в B)

Программа должна сначала проанализировать A и учитесь, какие сообщения распространены, затем анализируют B показу с сообщениями необходимо уделять внимание.

Идеально это должно автоматически игнорировать вещи как метки времени, номера строки или другие энергозависимые вещи.

Пример. A:

0:00:00.234  Received buffer 0x324234
0:00:00.237     Processeed buffer 0x324234
0:00:00.238     Send buffer 0x324255
0:00:03.334  Received buffer 0x324255
0:00:03.337     Processeed buffer 0x324255
0:00:03.339     Send buffer 0x324255
0:00:05.171  Received buffer 0x32421A
0:00:05.173     Processeed buffer 0x32421A
0:00:05.178     Send buffer 0x32421A

B:

0:00:00.134  Received buffer 0x324111
0:00:00.137     Processeed buffer 0x324111
0:00:00.138     Send buffer 0x324111
0:00:03.334  Received buffer 0x324222
0:00:03.337     Processeed buffer 0x324222
0:00:03.338     Error processing buffer 0x324222 
0:00:03.339     Send buffer 0x3242222
0:00:05.271  Received buffer 0x3242FA
0:00:05.273     Processeed buffer 0x3242FA
0:00:05.278     Send buffer 0x3242FA
0:00:07.280     Send buffer 0x3242FA failed

Результат:

0:00:03.338     Error processing buffer 0x324222 
0:00:07.280     Send buffer 0x3242FA failed

Один из способов решить его может быть чем-то как этот:

  1. Разделите каждую строку к логическим единицам: 0:00:00.134 Received buffer 0x324111,0:00:00.134,Received,buffer,0x324111,324111,Received buffer, \d:\d\d:\d\d\.\d\d\d, \d+:\d+:\d+.\d+, 0x[0-9A-F]{6}... Это должно найти отдельные слова, простые шаблоны в числах, общие разметки (например, "некоторая дата, чем текст, чем число, чем текст, чем end_of_line"), также обработать комбинации вышеупомянутых. Поскольку это не легкая задача, пользовательская помощь (добавляющий regexes с явным "игнорированием, что", "делают основной фактор", "не разделяют к частям", "рассматривают как дату/число", "заботятся о порядке/количестве таких сообщений" правила) должен поддерживаться (но не требоваться) для него.
  2. Найдите повторяющиеся единицы и "категоризируйте" строки, отфильтруйте слишком энергозависимые вещи как метки времени, адреса или номера строки.
  3. Проанализируйте второй файл, найдите вещи, который имеет новые логические единицы (одноразовый или повторяющийся), или что-либо, что "поразит" систему, которая привыкла для первого файла.

Пример того, чтобы вносить свою лепту этого вручную:

$ cat A | head -n 1
0:00:00.234  Received buffer 0x324234

$ cat A | egrep -v "Received buffer" | head -n 1
0:00:00.237     Processeed buffer 0x324234

$ cat A | egrep -v "Received buffer|Processeed buffer" | head -n 1
0:00:00.238     Send buffer 0x324255

$ cat A | egrep -v "Received buffer|Processeed buffer|Send buffer" | head -n 1

$ cat B | egrep -v "Received buffer|Processeed buffer|Send buffer"
0:00:03.338     Error processing buffer 0x324222 
0:00:07.280     Send buffer 0x3242FA failed

Это - скучная вещь (существует много типов сообщений); также я могу случайно включать некоторый слишком широкий шаблон. Также это не может обработать сложные вещи как взаимосвязь между сообщениями.

Я знаю, что это связано с AI. Может ли быть уже существуют разработанные инструменты?

3
задан 09.04.2017, 14:00

3 ответа

diff (и его различные варианты), покажет Вам различия оба пути и сохранит порядок сообщения. Это, однако, не удалит дубликаты различий (для которого можно подать заявку uniq впоследствии) или соглашение с переменным порядком. Это достаточно хорошо?

0
ответ дан 08.12.2019, 04:21

Использовать diff (в нормальном режиме вывода, т.е. нет -c или -u). Новые строки будут снабжены префиксом >.

diff A B | sed -ne 's/> //p'

Если журналы содержат метки времени, необходимо будет снять изоляцию с них сначала.

Иногда более хорошо видеть новые/измененные биты в контексте с выделением различия и навигацией между отличающимися блоками. Emacs имеет хороший интерфейс для этого (Инструменты | меню Compare, M-x ediff-files). Существует также много автономных инструментов (часто с “разностью”, или “сравните” на их имя).

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

0
ответ дан 08.12.2019, 04:21

Это - трудная проблема, и в несколько общей форме активная проблема исследования. Я не думаю там, теперь существует программа, в которую необходимо было бы просто включить несколько regexps.

Я сформулировал бы Вашу программу как пытающийся сравнить трассировки сетевой программы. Я подозреваю, что люди, которые сравнивают трассировки сетевых или параллельных программ, столкнулись с этой проблемой и записали их собственные инструменты, но я не имею определенного примера в виду.

0
ответ дан 08.12.2019, 04:21

Теги

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