“ ลบ” อัจฉริยะของไฟล์บันทึกข้อความหนึ่งไฟล์จากอีกไฟล์หนึ่ง


3

ตัวอย่าง: แอปพลิเคชันสร้างไฟล์บันทึกข้อความขนาดใหญ่Aพร้อมข้อความที่แตกต่างกันมากมาย มันสร้างไฟล์บันทึกที่มีขนาดใหญ่คล้ายกันBเมื่อทำงานไม่ถูกต้อง

ผมต้องการที่จะเห็นสิ่งที่ข้อความในไฟล์จะเป็นคนใหม่เป็นหลักคือเพื่อกรองเอาทุกอย่างจากBA

ต้นแบบเล็กน้อยคือ

  1. จัดเรียง | เปิดทั้งสองไฟล์
  2. เข้าร่วมไฟล์
  3. จัดเรียง | uniq -c
  4. 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

วิธีหนึ่งในการแก้ปัญหาอาจเป็นดังนี้:

  1. แยกแต่ละบรรทัดไปยังหน่วยตรรกะ: 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]{6}, ... มันควรจะหาคำแต่ละรูปแบบที่เรียบง่ายในจำนวนรูปแบบที่พบบ่อย (เช่น "วันที่บางกว่าข้อความกว่าจำนวนกว่าข้อความกว่า end_of_line") นอกจากนี้ยังมี จัดการรวมกันของด้านบน เนื่องจากไม่ใช่งานง่ายการช่วยเหลือผู้ใช้ (เพิ่ม regexes อย่างชัดเจนโดยไม่สนใจว่า "ทำให้ปัจจัยหลัก", "ไม่แยกเป็นส่วน", "พิจารณาเป็นวันที่ / หมายเลข", "ดูแลคำสั่ง / ปริมาณ ของกฎ "ข้อความดังกล่าว) ควรได้รับการสนับสนุน (แต่ไม่จำเป็น)
  2. ค้นหาหน่วยที่เกิดซ้ำและบรรทัด "จัดหมวดหมู่" กรองสิ่งที่ระเหยง่ายเกินไปเช่นการประทับเวลาที่อยู่หรือหมายเลขบรรทัด
  3. วิเคราะห์ไฟล์ที่สองค้นหาสิ่งต่าง ๆ ที่มีหน่วยทางลอจิคัลใหม่ (ครั้งเดียวหรือเกิดขึ้นอีกครั้ง) หรืออะไรก็ตามที่จะ "ทำให้ประหลาดใจ" ระบบที่เคยชินกับไฟล์แรก

ตัวอย่างการทำสิ่งนี้ด้วยตนเอง:

$ 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

นี่เป็นสิ่งที่น่าเบื่อ (มีข้อความหลายประเภท); นอกจากนี้ฉันยังสามารถรวมรูปแบบที่กว้างเกินไปโดยไม่ตั้งใจได้ด้วย นอกจากนี้มันไม่สามารถจัดการสิ่งที่ซับซ้อนเช่นความสัมพันธ์ระหว่างข้อความ

ฉันรู้ว่ามันเกี่ยวข้องกับ AI อาจมีเครื่องมือที่พัฒนาแล้วหรือไม่?


แก้ไขให้ถูกต้องหากฉันผิด แต่ไม่ใช่คำถามประเภทนี้ที่ควรโพสต์ที่ SO ???
Avis

@ ถึงฉันคิดว่าคำถามเช่น "โปรแกรมที่ใช้ทำ .... " คือ SU แน่นอนว่าโปรแกรมดังกล่าวจะมีประโยชน์สำหรับผู้ใช้ SO และ SF
วิ

@Vi: ดูเหมือนว่าคุณกำลังมุ่งหน้าไปยังโซลูชันการเขียนโปรแกรมแทนที่จะพยายามหาโปรแกรมที่เหมาะสมตามสมมุติฐาน การขอคำแนะนำการออกแบบเกี่ยวกับ SO นั้นเหมาะสม
Gilles

@Gilles คำถามของฉันมักเริ่มต้นด้วย "ฉันควรใช้โปรแกรมใดในการทำสิ่งนี้และสิ่งนี้" และจบลงด้วยสคริปต์ที่ฉัน (หรือผู้ใช้รายอื่น) เขียนไว้ ฉันไม่ทราบว่าควรย้ายข้อมูลดังกล่าวไปยัง SO หรือไม่ / * ไปถามที่ Meta * /
Vi

คำตอบ:


0

diff(และตัวเลือกต่าง ๆ ) จะแสดงความแตกต่างทั้งสองวิธีและเก็บรักษาลำดับข้อความ อย่างไรก็ตามจะไม่ลบความซ้ำซ้อน (เพื่อที่คุณสามารถนำไปใช้ได้uniqภายหลัง) หรือจัดการกับลำดับที่แตกต่างกัน ดีพอหรือไม่


ไม่ไฟล์นั้นไม่เหมือนกัน มีหลายสิ่งหลายอย่างเช่นการประทับเวลาการสั่งซื้อและปริมาณข้อความที่คล้ายกัน
วิ

0

ใช้diff(ในโหมดปกติ, เช่น, -cหรือ-u) บรรทัดใหม่จะถูก>ขึ้นต้นด้วย

diff A B | sed -ne 's/> //p'

หากบันทึกมีการประทับเวลาคุณจะต้องตัดออกก่อน

บางครั้งมันก็ดีกว่าที่จะเห็นบิตใหม่ / ที่เปลี่ยนแปลงในบริบทโดยเน้นความแตกต่างและการนำทางระหว่างชิ้นส่วนที่แตกต่างกัน Emacs มีส่วนต่อประสานที่ยอดเยี่ยมสำหรับสิ่งนี้ (เครื่องมือ | เมนูเปรียบเทียบ, M-x ediff-files) นอกจากนี้ยังมีเครื่องมือแบบสแตนด์อโลนจำนวนมาก (มักจะมี "ต่างกัน" หรือ "เปรียบเทียบ" ในชื่อของพวกเขา)

อนึ่งหากคุณไม่สนใจคำสั่งของบรรทัดการเรียงไฟล์ทั้งสองแล้วตามด้วยcommจะง่ายกว่าและดีกว่ากระบวนการที่คุณให้ไว้ในคำถาม


จะใช้diffงานได้จริงหรือไม่หากไฟล์ไม่มีส่วนที่มีขนาดใหญ่คล้ายกันเท่านั้นเช่นมีประเภทข้อความเดียวกัน (ยกเว้นบางข้อความเพิ่มเติมB) ไฟล์มีขนาดใหญ่มากและมีประเภทข้อความหลายประเภท แอปพลิเคชันมีตัวจับเวลาและวัดประสิทธิภาพการทำงานและขึ้นอยู่กับเซิร์ฟเวอร์ (ซึ่งมีตัวจับเวลาด้วย) PS มันเป็นบันทึกการแก้ปัญหาอย่างละเอียด gstreamer
วิ

@Vi: ไม่diffต้องการส่วนที่เหมือนกันยกเว้นช่องว่าง ปัญหาทั่วไปของการเปรียบเทียบการติดตามแอปพลิเคชันอาจเป็นเรื่องยากมาก เมื่อให้ผลลัพธ์ตัวอย่างที่คุณโพสต์ในขณะนี้การเพิกเฉยต่อการประทับเวลาดูโอเค แต่หมายเลขบัฟเฟอร์ดูเหมือนจะสื่อข้อมูลที่คุณไม่ต้องการเสีย A และ B มีลำดับของบัฟเฟอร์ที่เหมือนกันในการส่งและรับ (ด้วยตัวเลขที่แตกต่างกันและความสำเร็จ / ความล้มเหลว) หรือว่าจดหมายโต้ตอบแตกสลายอย่างรวดเร็วหรือไม่?
Gilles

ฉันจำเป็นต้องรู้ว่าอะไรเป็นข้อความใหม่ในBระบบ / * ทำภารกิจเฉพาะโดยใช้มือด้วยการสร้างcat A | egrep -b 'msg1|msg2|msg3|...|msgN'บรรทัดที่ยาวมากและออกให้บนb* / ฉันคิดว่ามันควรจะเป็นสิ่งที่ขับเคลื่อนด้วย AI เช่นผู้จัดหมวดหมู่อัตโนมัติหรือสิ่งที่แยกคำหลัก
วิ

s / egrep -b / egrep -v /
Vi

0

นี่เป็นปัญหาที่ยากและในรูปแบบทั่วไปค่อนข้างเป็นปัญหาการวิจัยที่ใช้งานอยู่ ฉันไม่คิดว่าจะมีโปรแกรมที่คุณต้องเสียบ regexps สองสามรายการ

ฉันจะกำหนดโปรแกรมของคุณเพื่อพยายามเปรียบเทียบร่องรอยของโปรแกรมเครือข่าย ฉันสงสัยว่าคนที่เปรียบเทียบร่องรอยของเครือข่ายหรือโปรแกรมที่เกิดขึ้นพร้อมกันได้ประสบกับปัญหานี้และเขียนเครื่องมือของตัวเอง แต่ฉันไม่มีตัวอย่างที่เฉพาะเจาะจงในใจ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.