Простой способ различать файлы журналов, игнорируя временные метки?

StackOverflow https://stackoverflow.com/questions/44019

Вопрос

Мне нужно разделить два файла журнала, но игнорировать часть метки времени в каждой строке (первые 12 символов, если быть точным).Есть ли хороший инструмент или умная команда awk, которая могла бы мне помочь?

Это было полезно?

Решение

В зависимости от используемой вами оболочки вы можете изменить подход @Блэр предлагается в виде 1-лайнера

diff <(cut -b13- file1) <(cut -b13- file2)

(+1 к @Блэр для оригинального предложения :-)

Другие советы

@EBGreen сказал

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

Вероятно, это лучший выбор, если только ваш инструмент diffing не обладает особыми возможностями.Например, вы могли бы

cut -b13- file1 > trimmed_file1
cut -b13- file2 > trimmed_file2
diff trimmed_file1 trimmed_file2

Смотрите ответ @toolkit для оптимизации, которая делает это однострочным и устраняет необходимость в дополнительных файлах.Если ваша оболочка это поддерживает.Bash 3.2.39, по крайней мере, так кажется...

Ответы с использованием cut все в порядке, но иногда сохранение временных меток в пределах diff результат заметен.Поскольку вопрос ОП касается игнорирование временных меток (не удаляя их), я делюсь здесь своей хитрой командной строкой:

diff -I '^#' <(sed -r 's/^((.){12})/#\1\n/' 1.log) <(sed -r 's/^((.){12})/#\1\n/' 2.log)
  • sed изолирует временные метки (# до и \n после) в течение замена процесса
  • diff -I '^#' игнорирует строки, имеющие эти временные метки (строки, начинающиеся на #)

пример

Два файла журнала с одинаковым содержимым, но разными временными метками:

$> for ((i=1;i<11;i++)) do echo "09:0${i::1}:00.000 data $i"; done > 1.log
$> for ((i=1;i<11;i++)) do echo "11:00:0${i::1}.000 data $i"; done > 2.log

Базовые модели diff командная строка говорит, что все строки разные:

$> diff 1.log 2.log
1,10c1,10
< 09:01:00.000 data 1
< 09:02:00.000 data 2
< 09:03:00.000 data 3
< 09:04:00.000 data 4
< 09:05:00.000 data 5
< 09:06:00.000 data 6
< 09:07:00.000 data 7
< 09:08:00.000 data 8
< 09:09:00.000 data 9
< 09:01:00.000 data 10
---
> 11:00:01.000 data 1
> 11:00:02.000 data 2
> 11:00:03.000 data 3
> 11:00:04.000 data 4
> 11:00:05.000 data 5
> 11:00:06.000 data 6
> 11:00:07.000 data 7
> 11:00:08.000 data 8
> 11:00:09.000 data 9
> 11:00:01.000 data 10

Наш хитрый diff -I '^#' не отображает никакой разницы (временные метки игнорируются):

$> diff -I '^#' <(sed -r 's/^((.){12})/#\1\n/' 1.log) <(sed -r 's/^((.){12})/#\1\n/' 2.log)
$>

Изменение 2.log (заменить data Автор: foo на 6-й строке) и проверьте еще раз:

$> sed '6s/data/foo/' -i 2.log
$> diff -I '^#' <(sed -r 's/^((.){12})/#\1\n/' 1.log) <(sed -r 's/^((.){12})/#\1\n/' 2.log)
11,13c11,13
11,13c11,13
< #09:06:00.000
<  data 6
< #09:07:00.000
---
> #11:00:06.000
>  foo 6
> #11:00:07.000

=> временные метки хранятся в diffвывод!

Вы также можете использовать бок о бок функция, использующая -y или --side-by-side вариант:

$> diff -y -I '^#' <(sed -r 's/^((.){12})/#\1\n/' 1.log) <(sed -r 's/^((.){12})/#\1\n/' 2.log)
#09:01:00.000                   #11:00:01.000
 data 1                          data 1
#09:02:00.000                   #11:00:02.000
 data 2                          data 2
#09:03:00.000                   #11:00:03.000
 data 3                          data 3
#09:04:00.000                   #11:00:04.000
 data 4                          data 4
#09:05:00.000                   #11:00:05.000
 data 5                          data 5
#09:06:00.000                 | #11:00:06.000
 data 6                       |  foo 6
#09:07:00.000                 | #11:00:07.000
 data 7                          data 7
#09:08:00.000                   #11:00:08.000
 data 8                          data 8
#09:09:00.000                   #11:00:09.000
 data 9                          data 9
#09:01:00.000                   #11:00:01.000
 data 10                         data 10

Старый sed

Если ваш sed реализация не поддерживает -r в противном случае вам, возможно, придется сосчитать двенадцать точек <(sed 's/^\(............\)/#\1\n/' 1.log) или используйте другой шаблон по вашему выбору ;)

Для графической опции, Слияние можете сделать это, используя его текстовые фильтры особенность.

Это позволяет игнорировать строки, основанные на одном или нескольких регулярных выражениях python.Различия по-прежнему отображаются, но строки, которые не имеют никаких других различий, выделяться не будут.

Example configuration

Использование Kdiff3 и в Настройка> Разница редактировать "Команда препроцессора сопоставления строк" к чему - то вроде:

sed "s/[ 012][0-9]:[0-5][0-9]:[0-5][0-9]//"

Это позволит отфильтровать временные метки из алгоритма выравнивания сравнения.

Kdiff3 также позволяет вам вручную выровняйте определенные линии.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top