grep เป็นหนึ่งในเครื่องมือที่ใช้มากที่สุดในบรรทัดคำสั่ง GNU / Linux แม้จะเป็นเครื่องมือที่เรียบง่าย แต่ก็ช่วยให้คุณสามารถดำเนินการได้จำนวนมาก โดยเฉพาะอย่างยิ่งใช้ร่วมกับท่อเพื่อให้สามารถค้นหาจุดที่เฉพาะเจาะจงในเอาต์พุตของคำสั่งก่อนหน้าเป็นต้น แต่ยังมีเครื่องมือที่เรียกว่า egrep ซึ่งเทียบเท่ากับการรัน grep ด้วยอ็อพชัน -E
e มาจาก "Extended regex" ซึ่งเป็นสิ่งที่เปิดใช้งานตัวเลือก -E และสิ่งที่คุณมีใน egrep โดยค่าเริ่มต้นโดยไม่ใช้ตัวเลือกนั้น นั่นคือคุณสามารถใช้ไฟล์ ขยายนิพจน์ทั่วไป. ในบทช่วยสอนนี้ฉันจะไม่อธิบายว่านิพจน์ทั่วไปคืออะไรสามารถใช้งานได้อย่างไรและประเภทใดอยู่ใน * nix ฉันจะแสดงตัวอย่างที่เป็นประโยชน์ของสิ่งที่มีประโยชน์บางอย่างที่คุณสามารถทำได้ด้วย egrep ...
grep, egrep และ fgrep มีความคล้ายคลึงกัน ในความเป็นจริง egrep เทียบเท่ากับ grep -E และ fgrep เทียบเท่ากับ grep -F นั่นคือในกรณีที่เกี่ยวข้องกับเรามันจะตีความรูปแบบดังกล่าวเป็นนิพจน์ทั่วไปด้วย
คุณ ค้นหาบรรทัดหรือคำ ในไฟล์อย่างน้อยหนึ่งไฟล์เช่นเดียวกับกรณีของ grep ตัวอย่างเช่นสมมติว่าคุณต้องการค้นหาคำว่า ubuntu ในไฟล์ชื่อ snap.txt และในไฟล์. txt ทั้งหมดในไดเร็กทอรีปัจจุบัน:
egrep ubuntu snap.txt
egrep ubuntu *.txt
การค้นหายังสามารถ เรียกซ้ำ ในการค้นหาเนื้อหาทั้งหมดของไดเร็กทอรีปัจจุบัน:
egrep -r "hola mundo" *
จนถึงตอนนี้มีการค้นหาคำหรือสตริงที่แน่นอนนั่นคือโดยคำนึงถึงตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก (คำนึงถึงตัวพิมพ์เล็กและใหญ่) แต่ถ้าคุณต้องการทำในโหมดไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ ไม่ว่าจะเป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กก็ตามคุณสามารถใช้สิ่งต่อไปนี้ (หากคุณเพิ่ม w จะพบเฉพาะรายการที่ตรงกันทั้งหมด):
egrep -i "ejemplo" documento.txt
egrep -iw "ejemplo" documento.txt
แสดงไม่ใช่เรื่องบังเอิญ แต่ ชื่อไฟล์ที่พบรายการที่ตรงกัน:
egrep -l hola *.txt
แสดงเฉพาะรูปแบบหรือคำ ค้นหาภายในเอกสาร:
egrep -o printf hola.c
จำไว้ว่าคุณสามารถใช้ความเป็นไปได้ทั้งหมดที่คุณสามารถจินตนาการได้ คุณสามารถรวมหลายตัวเลือกที่เห็นก่อนหน้านี้หรือคุณสามารถเสริมด้วยตัวเลือกอื่น ๆ เช่น -A n และ -B n โดยที่ n จำนวนบรรทัดที่คุณต้องการแสดงก่อน (ก่อน) และหลัง (หลัง) ของการแข่งขันหรือทั้งสองอย่างในเวลาเดียวกัน (C) เพื่อให้คุณสามารถเห็นสิ่งที่อยู่รอบการแข่งขัน:
egrep -A 2 "printf" hola.c
egrep -B 2 "printf" hola.c
egrep -C 2 printf hola.c
ระงับบรรทัดที่มีรายการที่ตรงกันและแสดงเฉพาะบรรทัดที่ไม่ตรงกัน:
egrep -v "dos" números.doc
หรือถ้าคุณต้องการคุณสามารถใช้ หลายคำหรือตรงกับ -e. ตัวอย่างเช่น
egrep -v -e "uno" -e "dos" -e "tres" números.txt
ถ้าคุณใช้ -c สามารถนับจำนวนการแข่งขันเท่านั้นหรือกลับด้านด้วย -v เพื่อแสดงจำนวนบรรทัดที่ไม่ตรงกัน ตัวอย่างเช่น:
egrep -c "include" main.c
egrep -v -c "include" main.c
และแม้กระทั่ง แสดงหมายเลขบรรทัด ที่การแข่งขันเกิดขึ้นและตำแหน่งที่ครองตามลำดับ:
egrep -n "void" hola.c
egrep -o -b "printf" hola.c
และพร้อมกับ นิพจน์ทั่วไป ความสามารถของมันสามารถขยายได้ ตัวอย่างเช่นค้นหาบรรทัดที่ขึ้นต้นด้วยสวัสดีและลงท้ายด้วยลาก่อนหรือที่ขึ้นต้นด้วยสวัสดีตามด้วยอะไรก็ได้แล้วลาก่อนที่ตรงกันจะปรากฏขึ้นตามลำดับ:
* การแก้ไขคำสั่งต่อไปนี้: ขอบคุณสำหรับความคิดเห็นของผู้อ่าน Manuel Alcocer ฉันสามารถแก้ไขคำสั่งต่อไปนี้ได้เนื่องจากมีข้อผิดพลาด
egrep '^Hola.*adiós$' ejemplo.txt
egrep "Hola.*adiós" ejemplo.txt
แต่ถ้าคุณสงสัยเกี่ยวกับความแตกต่างของ grep นี่คือตัวอย่างที่จะทำให้ชัดเจน ... ในกรณีที่ใช้ grep โดยไม่มี -E คุณควรใช้ ลำดับการหลบหนี เพื่อให้ตีความอักขระพิเศษเช่นนั้นมิฉะนั้นจะตีความรูปแบบดังกล่าวโดยไม่ต้องคำนึงถึง ในทางกลับกันการใช้ egrep หรือ grep -E จะคำนึงถึงสิ่งเหล่านี้ด้วย ตัวอย่างเช่น:
grep '^no\(fork\|group\)' /etc/group
นั่นจะเทียบเท่ากับ:
grep -E '^no(fork|group)' /etc/group
egrep '^no(fork|group)' /etc/group
นั่นคือมันจะมองหาบรรทัดที่ตรงกันที่ขึ้นต้นด้วย nofork หรือ nogroup แต่ถ้าคุณใช้นิพจน์แรกของ grep โดยไม่มีลำดับการหลีกเลี่ยงสิ่งที่จะทำคือการค้นหา รูปแบบคอนกรีต ไม่ (ส้อม | กลุ่ม):
grep 'no(fork|group)' /etc/group
คุณยังสามารถค้นหา ช่วงตัวอักษรและตัวเลขหรือค่าเฉพาะเช่นเพื่อค้นหา IP บางรายการ:
cat /etc/networks | egrep "192.168.1.[5-9]"
cat /etc/networks | egrep "192.168.[1-3].[5-9]"
cat /etc/networks | egrep "192.168.1.[0-3]|[5-9]"
egrep 192.168.4.[10,40] networks
หากคุณต้องการคุณสามารถใช้นิพจน์ทั่วไปอื่น ๆ เพื่อทำการค้นหาที่เฉพาะเจาะจงมากขึ้น ตัวอย่างเช่น | เพื่อค้นหา ความบังเอิญหรืออื่น ๆ:
egrep -i '^(printf|scanf)' hola.c
คุณยังสามารถค้นหา ตัวพิมพ์ใหญ่ตัวพิมพ์เล็กอักขระตามตัวอักษรเท่านั้นหรือตัวเลขและตัวอักษร ฯลฯโดยใช้นิพจน์อื่น ๆ เช่น: [: alnum:], [: alpha:], [: digit:], [: lower:], [: print:], [: punct:], [: space:], [: ด้านบน:] ฯลฯ ตัวอย่างเช่นในการค้นหาตัวพิมพ์ใหญ่:
egrep [[:upper:]] diccioario
ฉันหวังว่ามันจะช่วยคุณได้ ... เร็ว ๆ นี้ฉันจะอธิบายนิพจน์ทั่วไปในบทความที่จัดทำขึ้นโดยเฉพาะ ...
สวัสดี
ข้อสังเกตบางประการ ...
คุณอธิบายคำสั่ง 'egrep' แต่อย่าใส่ความแตกต่างระหว่าง 'egrep' และ 'grep' ซึ่งควรเป็นสิ่งที่อยู่ที่นี่
ตัวอย่างเช่น:
ด้วย grep: ip -4 a | grep '[0-9] \ +'
ด้วย egrep: ip -4 a | egrep '[0-9] +'
อ่าและนี่ไม่ถูกต้อง 'egrep "สวัสดี * ลาก่อน" example.txt'; ความสำเร็จที่นี่เกิดขึ้นเมื่อมีบรรทัดในไฟล์ที่มีสตริง "สวัสดี" ตามด้วยอะไรก็ตามและตามด้วย "ลาก่อน" บรรทัดสามารถเริ่มต้นและลงท้ายด้วยอะไรก็ได้
นี่คือสิ่งที่บทความกล่าวว่า:
egrep '^ สวัสดี. * bye $' example.txt
และตัวเลือกทั้งหมดหรือเกือบทั้งหมด (ฉันไม่หยุดที่จะตรวจสอบ) เป็นตัวเลือกของ 'grep' ไม่ใช่ของ 'egrep' เท่านั้น
ขอแสดงความนับถือที่ดีที่สุด
ขอขอบคุณที่รายงานข้อผิดพลาดนั้น สิ่งที่คุณแสดงความคิดเห็นเกี่ยวกับนิพจน์ทั่วไปฉันใส่ไว้ในย่อหน้าที่สองแล้ว ฉันจะอุทิศบทความเฉพาะให้กับพวกเขาเนื่องจากมีจำนวนมากและบทความนี้จะใช้เวลานานเกินไป คำอวยพร!
สวัสดีอีกครั้งไอแซค
ในย่อหน้าที่สองคุณพูดโดยทั่วไปหรือควรจะพูดว่า 'egrep' เป็นนามแฝงของ 'grep -E' แต่คุณไม่ได้ยกตัวอย่างการใช้ 'egrep' กับนิพจน์ทั่วไปบางอย่างที่เขียนแตกต่างจากเมื่อใช้โดย ' grep '.
การอุทิศบทความเพื่ออธิบายนิพจน์ทั่วไปที่ขยายออกไปดูเหมือนเป็นเรื่องที่น่ากลัวสำหรับฉันเหนือสิ่งอื่นใดเนื่องจากมีไซต์เช่นนี้ที่ไม่ได้โฆษณาและกำลังทำงานให้ข้อมูลที่สำคัญมากสำหรับชุมชน GNU: https://www.rexegg.com/
ฉันไม่ได้เขียนที่นี่เพื่อหลอกล่อความตั้งใจของฉันทั้งหมดนี้คือถ้ามีคนอ่านรายการนี้เพื่อดูว่า 'egrep' หรือ 'grep' ทำอะไรโปรดดูแหล่งข้อมูลอื่นรายการนี้ไม่สามารถอ้างอิงถึงสิ่งใดได้มันอธิบายน้อยและไม่ดี นำเสนอข้อมูลที่ไม่จำเป็นและอาจสร้างความสับสนโดยเฉพาะอย่างยิ่งสำหรับผู้ที่ไม่มีความรู้เกี่ยวกับ GNU และเครื่องมือที่มีประสิทธิภาพที่มีให้
ในที่สุดคุณได้เพิ่มและแก้ไขข้อบกพร่องที่ฉันระบุไว้หลังจากความคิดเห็นแรกของฉันแล้ว (^ $) เช่นเดียวกับในไซต์อื่น ๆ คุณควรอ้างถึงบุคคลที่ทำการแก้ไขหรืออย่างน้อยก็บอกว่าเป็นการแก้ไขซึ่งเป็นส่วนหนึ่งของฐาน GNU ซึ่งเป็นฐานเดียวกับที่บล็อกนี้เริ่มต้นและได้รับ สูญหาย.
คำอวยพร
ขอบคุณสำหรับมุมมองของคุณ
ffff