diff
(и его различные варианты) покажет вам различия в обоих направлениях и сохранит порядок сообщений. Тем не менее, он не удалит дубликаты различий (для этого вы можете подать заявку uniq
позже) или работать с изменяющимся порядком. Это достаточно хорошо?
Интеллектуальное «Вычитание» одного текстового лог-файла из другого
Пример: приложение генерирует большой текстовый файл журнала A
со многими различными сообщениями. Он генерирует такой же большой файл журнала, B
когда не работает правильно.
Я хочу видеть, какие сообщения в файле B
принципиально новые, т.е. отфильтровывать все A
.
Тривиальный прототип это:
- Сортировать | uniq оба файла
- Присоединяйтесь к файлам
- сортировать | uniq -c
- 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
Одним из способов ее решения может быть что-то вроде этого:
- Разделить каждую строку логических единиц:
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]
, ... Он должен найти отдельные слова, простые узоры в цифрах, общие схемы (например, «некоторые даты, чем текст, чем многочисленнее текст, чем end_of_line»), а также обрабатывать комбинации выше. Поскольку это непростая задача, помощь пользователя (добавление регулярных выражений с явным «игнорировать это», «сделать основной фактор», «не разбивать на части», «считать датой / числом», «заботиться о заказе / количестве») таких сообщений "правила" должны быть поддержаны (но не обязательны) для него. - Найдите повторяющиеся единицы и «классифицируйте» строки, отфильтруйте слишком изменчивые вещи, такие как отметки времени, адреса или номера строк.
- Проанализируйте второй файл, найдите вещи, которые имеют новые логические единицы (одноразовые или повторяющиеся) или что-нибудь, что «поразит» систему, привыкшую к первому файлу.
Пример выполнения некоторых действий вручную:
$ 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
Это скучно (есть много типов сообщений); Кроме того, я могу случайно включить слишком широкий шаблон. Также он не может обрабатывать сложные вещи, такие как взаимосвязь между сообщениями.
Я знаю, что это связано с ИИ. Может быть, есть уже разработанные инструменты?
3 ответа на вопрос
Используйте diff
(в обычном режиме вывода, т. Е. Нет -c
или -u
). Новые строки будут иметь префикс >
.
diff A B | sed -ne 's/> //p'
Если журналы содержат метки времени, сначала их нужно удалить.
Иногда лучше видеть новые / измененные биты в контексте с выделением различий и навигацией между разными фрагментами. В Emacs есть хороший интерфейс для этого (меню Tools | Compare, M-x ediff-files
). Есть также много автономных инструментов (часто с «diff» или «сравнить» в их названии).
Кстати, если вас не интересует порядок строк, то сортировка обоих файлов с последующим comm
будет проще и приятнее, чем процесс, который вы задаете в своем вопросе.
Это сложная проблема, и в несколько общем виде это активная исследовательская проблема. Я не думаю, что сейчас существует программа, в которую нужно было бы просто включить несколько регулярных выражений.
Я бы сформулировал вашу программу как попытку сравнить следы сетевой программы. Я подозреваю, что люди, которые сравнивают следы сетевых или параллельных программ, столкнулись с этой проблемой и написали свои собственные инструменты, но я не имею в виду конкретный пример.
Похожие вопросы
-
9
В чем разница между командами "su -s" и "sudo -s"?
-
4
Требуется хороший бесплатный образ Ubuntu Server VMWare
-
4
Каковы различия между основными дистрибутивами Linux? Я замечу?
-
-
2
Ограничить использование процессора для Flash в Firefox?
-
2
Как мне заставить мой микрофон работать под Debian GNOME?
-
2
Конки установки - образцы / идеи?
-
3
Каковы различия между оконными менеджерами Linux?
-
2
ThunderBird / Синхронизация освещения с SE k770i
-
4
Файловая система Linux
-
6
Полноэкранная медленная вспышка в KDE 4