Пример: Приложение генерирует файл журнала крупного текста A
со многими различными сообщениями. Это генерирует столь же большой файл журнала B
когда не функционирует правильно.
Я хочу видеть что сообщения в файле B
являются чрезвычайно новыми, т.е. отфильтровывать все от A
.
Тривиальный прототип:
Это производит симметричное различие и неудобный. Как сделать это лучше? (включая несимметричное различие и сохранение сообщений заказывают в 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
Один из способов решить его может быть чем-то как этот:
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 с явным "игнорированием, что", "делают основной фактор", "не разделяют к частям", "рассматривают как дату/число", "заботятся о порядке/количестве таких сообщений" правила) должен поддерживаться (но не требоваться) для него.Пример того, чтобы вносить свою лепту этого вручную:
$ 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. Может ли быть уже существуют разработанные инструменты?
Использовать diff
(в нормальном режиме вывода, т.е. нет -c
или -u
). Новые строки будут снабжены префиксом >
.
diff A B | sed -ne 's/> //p'
Если журналы содержат метки времени, необходимо будет снять изоляцию с них сначала.
Иногда более хорошо видеть новые/измененные биты в контексте с выделением различия и навигацией между отличающимися блоками. Emacs имеет хороший интерфейс для этого (Инструменты | меню Compare, M-x ediff-files
). Существует также много автономных инструментов (часто с “разностью”, или “сравните” на их имя).
Кстати, если Вы не интересовались порядком строк, затем сортируя оба файла, сопровождаемые comm
было бы легче и более хорошим, чем процесс, который Вы даете в своем вопросе.
Это - трудная проблема, и в несколько общей форме активная проблема исследования. Я не думаю там, теперь существует программа, в которую необходимо было бы просто включить несколько regexps.
Я сформулировал бы Вашу программу как пытающийся сравнить трассировки сетевой программы. Я подозреваю, что люди, которые сравнивают трассировки сетевых или параллельных программ, столкнулись с этой проблемой и записали их собственные инструменты, но я не имею определенного примера в виду.