วิธี grep สำหรับสายเดียวกัน แต่หลายไฟล์ในเวลาเดียวกันได้อย่างไร


57

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

grep -E 'fatal|error|critical|failure|warning|' /path_to_file

ฉันจะใช้สิ่งนี้และค้นหาสตริงของไฟล์หลายไฟล์พร้อมกันได้อย่างไร หากนี่เป็นสิ่งที่จำเป็นต้องมีสคริปต์ผู้อื่นสามารถให้สคริปต์ง่ายๆเพื่อทำสิ่งนี้ได้หรือไม่


2
grepสามารถใช้อาร์กิวเมนต์ไฟล์มากกว่าหนึ่งข้อ
jw013

คำตอบ:


61
grep -E 'fatal|error|critical|failure|warning|' *.log

ฉันgrepจะข้ามไดเรกทอรีได้อย่างไร แต่ยังคงตรวจสอบไฟล์ทั้งหมดซ้ำ? grep -E 'text' **/*ทำงาน แต่ให้ข้อผิดพลาดสำหรับแต่ละไดเรกทอรีย่อย (แล้วอย่างถูกต้องตรวจสอบไฟล์ทั้งหมดในพวกเขา)
Jorn

4
@ จอนจริงๆคุณควรถามคำถามใหม่ แต่ใช้find . -type f -exec grep -E 'fatal|error|critical|failure|warning' {} +
Wildcard

20

คุณสามารถใช้สิ่งนี้:

find . -name "*.log" | xargs grep -E 'fatal|error|critical|failure|warning|'

จะพบไฟล์ทุกไฟล์ที่มี.logนามสกุลและใช้grepคำสั่ง


มันง่ายเกินไป :) ที่จริงแล้วไฟล์ทั้งหมดของฉันเป็น. log ดังนั้น "grep -E 'ร้ายแรง | ข้อผิดพลาด | วิกฤติ | ล้มเหลว | คำเตือน' * .log ใช้งานเกินไปขอบคุณ!
user53029

1
ช่างเป็นความพยายามอย่างมากในการทำความเข้าใจ / ปรับตัว user53029!
Gilles Quenot

1
ทำไมต้องกังวลกับxargsความเป็นไปได้ที่จะเกิดการแตกที่รุนแรงในช่องว่างในชื่อไฟล์เมื่อคุณสามารถใช้ได้find . -name '*.log' -exec grep -E 'fatal|error|critical|failure|warning' {} +?
Wildcard

16

ถ้ามันง่ายกว่าคุณสามารถระบุแต่ละไฟล์ทีละไฟล์

grep -E 'fatal|error|critical|failure|warning' file1.log file2.log 

2
ง่ายมาก แต่กำลังมองหาสิ่งนี้มานานเกินไป: 0
อดัมฮิวจ์ส

3

หากคุณต้องการ grep ในชื่อไฟล์ที่ไม่สามารถเรียกคืนได้โดยนิพจน์ทั่วไป:

grep -E 'fatal|error|critical|failure|warning|' `cat<<FIN
> file1
> file2
> ...
> filen
> FIN`

อะไรคือข้อดีของการวางชื่อไฟล์ทีละไฟล์? คุณสามารถรวบรวมรายชื่อไฟล์ในไฟล์ข้อความแล้ววาง



0

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

ดาวน์โหลดสคริปต์ค้นหาบันทึก

วิธีการทำงานนี้ค่อนข้างง่าย

สถานการณ์ที่ 1: ตรวจสอบหนึ่งสายในแฟ้มบันทึกเดียว

./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open' '.'  1 2 single_errCheck -ndshow

สถานการณ์ที่ 2: ตรวจสอบสตริงหลายรายการในไฟล์บันทึกเดียว

./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 multi_errCheck -ndshow

สถานการณ์ที่ 3:ตรวจสอบสตริงเดียว / หลายรายการในไฟล์บันทึกหลายไฟล์

./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 multi_err_multi_logCheck -ndshow

หมายเหตุ:

_P_ หมายถึง OR - มันแทนที่ไปป์ "|" สัญลักษณ์เพราะมีโอกาสน้อยที่คุณจะต้องค้นหาสตริงที่มี "_P_" หากคุณไม่ต้องการพิมพ์ "_P_" คุณสามารถแทนที่ _P_ ด้วย "|"

เมื่อใช้สคริปต์นี้พารามิเตอร์ที่คุณจะเปลี่ยนบ่อยคือ:

  1. ล็อกไฟล์หรือไดเร็กทอรีล็อกที่ต้องถูกมอนิเตอร์
  2. อายุไฟล์บันทึกจะต้องมีการตรวจสอบ .. ไม่ตรวจสอบหรือค้นหาไฟล์บันทึกใด ๆ ที่มีการประทับเวลานานกว่า 60 นาที
  3. สตริง / รูปแบบที่คุณต้องการดู
  4. แท็ก - นี่คืออาร์กิวเมนต์ที่สองถึงครั้งสุดท้ายที่คุณต้องระบุ มันบันทึกสถิติเกี่ยวกับไฟล์บันทึกที่คุณกำลังตรวจสอบภายใต้ / var / tmp / logXray
  5. ตัวเลือกการบันทึก -ndshow - นี่คือพารามิเตอร์ที่คุณต้องการใช้หากคุณต้องการที่จะส่งออกรายการจากบันทึกที่พบตรงกับรูปแบบที่คุณระบุ หากคุณต้องการดูจำนวนรวมของแต่ละรูปแบบที่พบเพียงแค่แทนที่ '-ndshow' ด้วย '-ndfoundmul'

เมื่อใช้ '-ndfoundmul' คุณจะได้ผลลัพธ์คล้ายกับ:

[root@dgphxtest001]# ./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 blahblahA -ndfoundmul
OK: [/var/log/messages][1]  /var/log/messages:P=(can_t_open=0 ntpd_stat=0)_F=(117s)_R=(228,228=0) 

วิธีการแก้ไขปัญหาของโปสเตอร์ต้นฉบับ:สแกนหาหลายสายในไฟล์บันทึกหลายไฟล์

./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m 'fatal_P_error_P_critical_P_failure_P_warning' '.'  1 2 multierr_logCheck -ndshow

ระบบปฏิบัติการ:สิ่งนี้ได้รับการทดสอบบน Ubuntu และ Red Hat


0
grep -EFn "fatal|error|critical|failure|warning|search-string" /path/to/the/file/log_file?.lo* --color=auto

สิ่งนี้จะค้นหา'ร้ายแรงหรือข้อผิดพลาดหรือสำคัญหรือล้มเหลวหรือคำเตือนหรือค้นหาสตริง "ในไฟล์ที่มีชื่อขึ้นต้นด้วย' log_file? ' และนามสกุล'lo ' * ในพา ธ/ พา ธ / ไปยัง / ไฟล์ /และให้สตริงการค้นหามีสีแบบสุ่มและหมายเลขบรรทัดการพิมพ์ที่พบที่


แน่ใจว่านี่เป็นคำตอบที่ใช้งานได้ แต่ผู้ใช้ขอให้ค้นหาโดยใช้รูปแบบคุณตอบโดยใช้สตริงการค้นหาแบบคงที่ ขออภัยการเพิ่มสิ่งต่าง ๆ ที่ไม่ได้ถามเช่นการเรียงลำดับหมายเลขและสีของผลลัพธ์ไม่น่าจะทำให้คำตอบมีประโยชน์มากขึ้น แต่จะมีคำถามอื่นที่สามารถตอบgrepทักษะของคุณได้ดังนั้นขอให้โชคดีในอาชีพการงานของคุณ!
zagrimsan

@zagrimsan ชี้ให้เห็นฉันได้เพิ่ม-E 'ร้ายแรง | ข้อผิดพลาด | สำคัญ | ล้มเหลว | คำเตือน |' ทำมันให้ดี
Obaid

และเฮ้เขาถามหาหลายไฟล์โดยเฉพาะไม่ใช่รูปแบบการค้นหา โปรดอ่านคำถามอีกครั้ง
Obaid

อ้างอิงจาก Q: "ค้นหาสตริงเฉพาะ" และคำถามแสดงรูปแบบการค้นหา (มีหลายสตริงให้ตรงกับ) เขาใช้ คุณถูกที่ชื่อของคำถามนั้นเล็กน้อยจากสิ่งที่เขาถามจริง ๆ BTW -Eและ-Fไม่สามารถใช้งานได้ในเวลาเดียวกันมันขัดแย้งกัน (พิมพ์ผิด)
zagrimsan

0

คำตอบของ JigarGandhiแสดงให้เห็นถึงการใช้สัญลักษณ์ดอกจัน มีขึ้นของพวกเขาและคุณสามารถเห็นพวกเขาที่นี่man 7 globหรือโดยการเรียกใช้

[]หนึ่งในนั้นที่ผมพบว่ามีประโยชน์คือการจับคู่กับช่วง เนื่องจากระบบที่ฉันทำงานนั้นสร้างไฟล์บันทึกที่มีหมายเลขตามลำดับเช่นproduct.log.1 product.log.2 ... product.log.200มันจึงสะดวกในการ grep โดยใช้คำสั่งเดียวในไฟล์ 3 หรือ 4 ไฟล์ตามลำดับ แต่ไม่มาก ดังนั้นสิ่งนี้

grep 'whatever' product.log.[5-7]

จะ grep สำหรับไฟล์ทั้งหมดที่ลงท้ายด้วย product.log 5, 6 หรือ 7 ไวด์การ์ดไม่จำเป็นต้องอยู่ท้ายที่สุดเพื่อให้คำตอบของการสั่นไหวนั้นง่ายขึ้น

grep -E 'fatal|error|critical|failure|warning' file[1,2].log

โปรดทราบว่าสามารถใช้อักขระตัวแทนเหล่านี้ในคำสั่งอื่นเช่นในcpตัวอย่าง


0

คุณสามารถใช้เครื่องหมายปีกกาหากไฟล์ต่าง ๆ อยู่ในโฟลเดอร์เดียวกัน

ดูตัวอย่าง

grep -E 'fatal|error|critical|failure|warning|' /var/log/{messages,secure,syslog,dmesg}

หากคุณเพิ่ม s ลงใน grep จะมีข้อผิดพลาดเกี่ยวกับไฟล์ที่หายไป

grep -sE 'fatal|error|critical|failure|warning|' /var/log/{messages,secure,syslog,dmesg}

ฉันเพิ่งทดลองกับตัวเองเพื่อทำคำสั่งที่ทำงานข้ามหลาย distros ที่มันอยู่ในไฟล์เดียวกับที่อื่นเนื่องจากความแตกต่างของระบบปฏิบัติการ

บันทึกเมล

sudo grep -is bob@example.com /var/log/{maillog,exim_mainlog,exim_rejectlog,mail.log,mail.err,syslog}

บันทึกเมลที่เก็บถาวรโดยใช้ 2> / dev / null เพื่อยกเลิก zgrep คำเตือน. gz ที่ขาดหายไป

sudo zgrep -is bob@example.com /var/log/{maillog*,exim_mainlog*,exim_rejectlog*,mail.log*,mail.err*,syslog*} 2>/dev/null

การอ้างอิง: มีวิธีการอ้างถึงหลายไฟล์ในไดเรกทอรีโดยไม่ต้องพิมพ์เส้นทางทั้งหมดหรือไม่

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