Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

В зависимости от используемой оболочки вы можете включить подход @Blair в 1-футовый

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

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

Ответ 2

@EbGreen сказал

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

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

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

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

Ответ 3

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

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) или использовать другой шаблон по вашему выбору;)

Ответ 4

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

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

Пример конфигурации

Ответ 5

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

Ответ 6

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

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

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

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