طريقة سهلة لفرق ملفات السجل، وتجاهل الطوابع الزمنية؟

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

سؤال

أحتاج إلى التمييز بين ملفي سجل مع تجاهل جزء الطابع الزمني في كل سطر (أول 12 حرفًا على وجه الدقة).هل هناك أداة جيدة، أو أمر ذكي يمكن أن يساعدني؟

هل كانت مفيدة؟

المحلول

اعتمادا على الصدفة التي تستخدمها، يمكنك تحويل النهج @ بلير مقترح في بطانة واحدة

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

(+1 إلى @ بلير للاقتراح الأصلي :-)

نصائح أخرى

قال @EbGreen

أود فقط أخذ ملفات السجل وإزالة الطوابع الزمنية من بداية كل سطر ثم حفظ الملف في ملفات مختلفة.ثم فرق تلك الملفات.

ربما يكون هذا هو الرهان الأفضل، إلا إذا كانت أداة التمييز الخاصة بك تتمتع بصلاحيات خاصة.على سبيل المثال، يمكنك

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

راجع استجابة @toolkit للحصول على تحسين يجعل هذا سطرًا واحدًا ويغني عن الحاجة إلى ملفات إضافية.إذا كانت قوقعتك تدعم ذلك.يبدو أن Bash 3.2.39 على الأقل...

الإجابات باستخدام 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 على السطر السادس) وتحقق مرة أخرى:

$> 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 regex.ستستمر الاختلافات في الظهور، لكن لن يتم تمييز الخطوط التي لا تحتوي على أي اختلافات أخرى.

Example configuration

يستخدم كدف3 وفي تكوين>الفرق يحرر "أمر المعالج المسبق لمطابقة الخط" إلى شيء مثل:

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

سيؤدي هذا إلى تصفية الطوابع الزمنية من خوارزمية محاذاة المقارنة.

يتيح لك Kdiff3 أيضًا محاذاة خطوط محددة يدويًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top