طريقة سهلة لفرق ملفات السجل، وتجاهل الطوابع الزمنية؟
سؤال
أحتاج إلى التمييز بين ملفي سجل مع تجاهل جزء الطابع الزمني في كل سطر (أول 12 حرفًا على وجه الدقة).هل هناك أداة جيدة، أو أمر ذكي يمكن أن يساعدني؟
نصائح أخرى
قال @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.ستستمر الاختلافات في الظهور، لكن لن يتم تمييز الخطوط التي لا تحتوي على أي اختلافات أخرى.
يستخدم كدف3 وفي تكوين>الفرق يحرر "أمر المعالج المسبق لمطابقة الخط" إلى شيء مثل:
sed "s/[ 012][0-9]:[0-5][0-9]:[0-5][0-9]//"
سيؤدي هذا إلى تصفية الطوابع الزمنية من خوارزمية محاذاة المقارنة.
يتيح لك Kdiff3 أيضًا محاذاة خطوط محددة يدويًا.