อ่านรูปแบบ grep จากไฟล์


49

ฉันมีไฟล์ข้อความขนาดใหญ่สองสามไฟล์และในไฟล์UNIQS.txtฉันมีรายการสตริงgrepจากไฟล์อื่น รหัสที่ฉันใช้คือ

grep -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam

ซึ่งไม่ทำอะไรเลย - ไฟล์ที่สร้างนั้นว่างเปล่า แต่เมื่อฉันทำ

grep -F -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam

มันทำงานได้อย่างถูกต้อง สิ่งนี้ทำให้ฉันสับสนเพราะฉันไม่คิดว่าgrepจะตีความรายการในUNIQS.txtรูปแบบ regexp โดยไม่ต้องมีเครื่องหมายคำพูดและเครื่องหมายทับและอยู่ในไฟล์ (ซึ่งไม่มี) โดยทั่วไปแล้วถ้าคุณได้รับรูปแบบจากไฟล์มันจะคิดว่ามันเป็นรูปแบบ regexp โดยอัตโนมัติหรือไม่?

แก้ไข:ในUNIQS.txtไฟล์มีสตริงที่คั่นด้วยบรรทัดใหม่ของฟอร์ม

HWI-ST365:215:D0GH0ACXX:2:1101:10034:186783

(เรียกว่าชื่อเทมเพลต) และEEP_VSL...แท็บไฟล์คั่นคอลัมน์ด้วยประมาณ 14 คอลัมน์และคอลัมน์แรกคือชื่อเทมเพลตดังนั้นโดยทั่วไปฉันต้องการแยกบรรทัดที่สอดคล้องกับเทมเพลตแต่ละไฟล์

คำตอบ:


60

-fตัวเลือกระบุแฟ้มที่ grep อ่านรูปแบบ นั่นเหมือนกับการส่งรูปแบบบนบรรทัดคำสั่ง (พร้อม-eตัวเลือกหากมีมากกว่าหนึ่ง) ยกเว้นว่าเมื่อคุณโทรจากเชลล์คุณอาจจำเป็นต้องอ้างอิงรูปแบบเพื่อป้องกันอักขระพิเศษจากการขยายโดยเชลล์

มีข้อโต้แย้ง-Eหรือ-Fหรือ-Pถ้ามีบอก grep ซึ่งไวยากรณ์รูปแบบที่เขียนด้วยอาร์กิวเมนต์ไม่มี grep คาดว่า. นิพจน์ปกติพื้นฐาน ; ด้วย-E, grep คาดว่าจะขยายการแสดงออกปกติ ; ด้วย-P(ถ้าสนับสนุน), grep คาดว่านิพจน์ปกติของ Perl ; และด้วย-Fgrep ต้องการสตริงตัวอักษร ไม่ว่ารูปแบบจะมาจากบรรทัดคำสั่งหรือมาจากไฟล์ไม่สำคัญ

โปรดทราบว่าสตริงนั้นเป็นสตริงย่อย: หากคุณผ่านa+bเป็นรูปแบบแล้วบรรทัดที่มีa+b+cจะถูกจับคู่ หากคุณต้องการค้นหาบรรทัดที่มีสตริงที่ระบุอย่างใดอย่างหนึ่งและไม่มีอีกต่อไปให้ผ่าน-xตัวเลือก


1
ตกลงว่ามีประโยชน์ขอบคุณ ฉันขอถามสมมติว่าฉันต้องการจับคู่สตริงอย่างแน่นอนเช่นถ้าสตริงเป็น 12345 แล้วฉันต้องการให้จับคู่กับ 12345 เท่านั้นไม่ใช่ 123456 หรือ 123455 เป็นต้นฉันจะทำสิ่งนี้อย่างไร
sdf

2
@sdf อ่านย่อหน้าสุดท้ายของฉัน:-x
Gilles 'หยุดความชั่วร้าย'

มันเก่าเกินไปขอโทษที่ขุดออกมา ในขณะที่คำอธิบายข้างต้นนั้นยอดเยี่ยมมันค่อนข้างคลุมเครือว่าทำไมรูปแบบ (สตริง) จากไฟล์ไม่ตรงกันหากไม่มี-Fแฟล็ก ฉันเดาว่า-ในบรรทัดตัวอย่างข้างต้นทำให้สิ่งนี้ถูกอ่านเป็นลำดับของอักขระหรือไม่ จะไม่ต้องใช้วงเล็บเหลี่ยมด้วยหรือไม่ ฉันได้ทดสอบกับไฟล์ตัวอย่าง แต่ยังไม่ได้ข้อสรุป
trs

@trs เส้นที่แสดงในคำถาม (ที่ถูกเพิ่มเข้ามาหลังจากที่ผมโพสต์คำตอบของฉัน) ไม่ได้มีตัวอักษรใด ๆ ที่มีความหมายพิเศษใน regexps -Fดังนั้นมันจะทำงานเดียวกันที่มีและไม่มี \[*^$มันจะสร้างความแตกต่างกับตัวละครเช่น
Gilles 'หยุดความชั่วร้าย' ใน

@Gilles ขอบคุณนั่นก็เป็นความประทับใจของฉันเช่นกัน แต่ @sdf อ้างว่า "ไฟล์ที่สร้างขึ้นนั้นว่างเปล่า" (อ่าน: ไม่ตรงกัน) หากไม่มี-Fแฟล็ก
trs

0

ฉันมีข้อผิดพลาดเดียวกันไม่แก้ไขด้วยคำตอบที่ดีจาก @gilles เมื่อมองเข้าไปใกล้ไฟล์อินพุตฉันพบว่ามีการขึ้นบรรทัดใหม่ 2 บรรทัดในตอนท้าย หากไม่มีสิ่งเหล่านี้สำเร็จจำเป็นเท่านั้น: ไฟล์ grep -i file_pattern_input

(GNU grep 3.1, ไฟล์อินพุตมากกว่า 5,000 เรคคอร์ด, การจับคู่ / รูปแบบไฟล์ 2536 ฉันรู้ว่า 2536 ทั้งหมดจะต้องอยู่ในไฟล์ด้วยการขึ้นบรรทัดใหม่มีทุกบรรทัดของไฟล์และไม่มีเฉพาะ 2536 บรรทัดที่ตรงกัน)


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