egrep: ตัวอย่างของคำสั่งใน GNU / Linux

นกกระยาง

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

ฉันหวังว่ามันจะช่วยคุณได้ ... เร็ว ๆ นี้ฉันจะอธิบายนิพจน์ทั่วไปในบทความที่จัดทำขึ้นโดยเฉพาะ ...


แสดงความคิดเห็นของคุณ

อีเมล์ของคุณจะไม่ถูกเผยแพร่ ช่องที่ต้องการถูกทำเครื่องหมายด้วย *

*

*

  1. ผู้รับผิดชอบข้อมูล: Miguel ÁngelGatón
  2. วัตถุประสงค์ของข้อมูล: ควบคุมสแปมการจัดการความคิดเห็น
  3. ถูกต้องตามกฎหมาย: ความยินยอมของคุณ
  4. การสื่อสารข้อมูล: ข้อมูลจะไม่ถูกสื่อสารไปยังบุคคลที่สามยกเว้นตามข้อผูกพันทางกฎหมาย
  5. การจัดเก็บข้อมูล: ฐานข้อมูลที่โฮสต์โดย Occentus Networks (EU)
  6. สิทธิ์: คุณสามารถ จำกัด กู้คืนและลบข้อมูลของคุณได้ตลอดเวลา

  1.   ภาพแทนของ Manuel Alcocer dijo

    สวัสดี

    ข้อสังเกตบางประการ ...

    คุณอธิบายคำสั่ง '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' เท่านั้น

    ขอแสดงความนับถือที่ดีที่สุด

    1.    ไอแซก dijo

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

      1.    ภาพแทนของ Manuel Alcocer dijo

        สวัสดีอีกครั้งไอแซค

        ในย่อหน้าที่สองคุณพูดโดยทั่วไปหรือควรจะพูดว่า 'egrep' เป็นนามแฝงของ 'grep -E' แต่คุณไม่ได้ยกตัวอย่างการใช้ 'egrep' กับนิพจน์ทั่วไปบางอย่างที่เขียนแตกต่างจากเมื่อใช้โดย ' grep '.

        การอุทิศบทความเพื่ออธิบายนิพจน์ทั่วไปที่ขยายออกไปดูเหมือนเป็นเรื่องที่น่ากลัวสำหรับฉันเหนือสิ่งอื่นใดเนื่องจากมีไซต์เช่นนี้ที่ไม่ได้โฆษณาและกำลังทำงานให้ข้อมูลที่สำคัญมากสำหรับชุมชน GNU: https://www.rexegg.com/

        ฉันไม่ได้เขียนที่นี่เพื่อหลอกล่อความตั้งใจของฉันทั้งหมดนี้คือถ้ามีคนอ่านรายการนี้เพื่อดูว่า 'egrep' หรือ 'grep' ทำอะไรโปรดดูแหล่งข้อมูลอื่นรายการนี้ไม่สามารถอ้างอิงถึงสิ่งใดได้มันอธิบายน้อยและไม่ดี นำเสนอข้อมูลที่ไม่จำเป็นและอาจสร้างความสับสนโดยเฉพาะอย่างยิ่งสำหรับผู้ที่ไม่มีความรู้เกี่ยวกับ GNU และเครื่องมือที่มีประสิทธิภาพที่มีให้

        ในที่สุดคุณได้เพิ่มและแก้ไขข้อบกพร่องที่ฉันระบุไว้หลังจากความคิดเห็นแรกของฉันแล้ว (^ $) เช่นเดียวกับในไซต์อื่น ๆ คุณควรอ้างถึงบุคคลที่ทำการแก้ไขหรืออย่างน้อยก็บอกว่าเป็นการแก้ไขซึ่งเป็นส่วนหนึ่งของฐาน GNU ซึ่งเป็นฐานเดียวกับที่บล็อกนี้เริ่มต้นและได้รับ สูญหาย.

        คำอวยพร

        1.    ไอแซก dijo

          ขอบคุณสำหรับมุมมองของคุณ

  2.   เซฟ dijo

    ffff