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


0

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

ตัวอย่างของสิ่งที่ฉันคิดว่าฉันกำลังมองหาคือ:

tail -f log | grep "string {ignore} string"

ขอบคุณล่วงหน้า.


ใช้.*ตำแหน่งที่คุณใส่ไว้{ignore}สำหรับสัญลักษณ์แทน "อะไรก็ได้"
dsstorefile1

คำตอบ:


-2

คุณต้องใช้WildCards (หรือ Globbing Patterns)ในgrepคำสั่งเช่นนี้:

 tail -f log | grep "some_string.*some_string"

โดยที่.*(ชี้โดย @ dsstorefile1 ในความคิดเห็น) คือรูปแบบการวนรอบที่ใช้ที่นี่ หากต้องการรับรายละเอียดเพิ่มเติมเกี่ยวกับรูปแบบ Globbing ให้อ้างอิงถึง manpages


man 7 glob

ซึ่งจะแสดงสิ่งนี้:

     . (dot) : will match any single character (except end of line) , 
               equivalent to ? (question mark) in standard wildcard expressions.

* (asterisk) : the proceeding item is to be matched zero or more times.
               ie. n* will match n, nn, nnnn, nnnnnnn
                           but not na or any other character.

ตอนนี้คุณจะได้ทั้งสองอย่างนี้มารวมกัน:

.* (dot and asterisk) : match any string, equivalent to * in standard wildcards.

นอกจากนี้ยังเห็นว่า @Bob ในความคิดเห็นการใช้งาน.*?นั้นดีกว่ามาก.*


2
.*เป็นโลภและอาจจับภาพมากกว่าที่คุณต้องการ .*?มักจะดีกว่า
บ๊อบ

1
นั่นไม่มีส่วนเกี่ยวข้องกับ " ?แทนที่." อ่านความคิดเห็นของฉันอีกครั้ง - ?มันคือการปรับเปลี่ยนใน*ทำให้ขี้เกียจแทนค่าเริ่มต้นโลภ สมมติว่า PCRE
บ๊อบ

2
ฉันควรชี้ให้เห็นว่านี่คือ regex (grep ทำ POSIX regex โดยปริยาย) ไม่ใช่ shell glob
บ๊อบ

@Bob แก้ไขคำตอบของฉันและคุณช่วยอธิบายเพิ่มเติมเกี่ยวกับ.*ความโลภและการใช้.*?แทนได้อย่างไร
C0deDaedalus

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