grep, pgrep, egrep, fgrep แตกต่างกันอย่างไร?


55

ผมอยากเดินผ่านบนความแตกต่างระหว่างgrep, pgrep, egrepและfgrepและวิธีการที่ฉันจะใช้พวกเขา


1
คำถามนี้มีคำตอบที่ดีในเว็บไซต์นี้ unix.stackexchange.com/questions/17949/…
Ali786

และยังมีสคริปต์ทุบตีsgrep :-)
pevik

คำตอบ:


85

ความแตกต่างระหว่าง grep, pgrep, egrep และ fgrep (Linux):

grep

grep เป็นตัวย่อที่ย่อมาจาก "Global Regular Expressions Print" grep เป็นโปรแกรมที่สแกนไฟล์หรือไฟล์ที่ระบุทีละบรรทัดบรรทัดที่ส่งคืนที่มีรูปแบบ รูปแบบคือนิพจน์ที่ระบุชุดของสตริงโดยการตีความอักขระเป็นเมตาอักขระ ตัวอย่างเช่นอักขระเครื่องหมายดอกจัน (*) ถูกตีความว่าเป็นความหมาย "ศูนย์หรือมากกว่าขององค์ประกอบก่อนหน้า" สิ่งนี้ทำให้ผู้ใช้สามารถพิมพ์ชุดอักขระสั้น ๆ และอักขระเมตาลงในคำสั่ง grep เพื่อให้คอมพิวเตอร์แสดงให้เราเห็นว่าบรรทัดไหนที่ไฟล์ตรงกัน

คำสั่ง grep มาตรฐานดูเหมือนว่า:

grep <flags> '<regular expression>' <filename>

grep พิมพ์ผลการค้นหาไปที่หน้าจอ (stdout) และส่งคืนค่าออกต่อไปนี้:

0    A match was found.
1    No match was found.
>1   A syntax error was found or a file was inaccessible 
     (even if matches were found).

บางธงทั่วไป: -cสำหรับการนับจำนวนของการแข่งขันที่ประสบความสำเร็จและไม่พิมพ์การแข่งขันที่เกิดขึ้นจริง-iในการทำกรณีการค้นหาตาย-nในการพิมพ์หมายเลขบรรทัดก่อนการแข่งขันแต่ละงานพิมพ์, -vจะใช้ส่วนประกอบของการแสดงออกปกติ (เช่นกลับสายที่ ไม่ตรงกัน) และ-lเพื่อพิมพ์ชื่อไฟล์ของไฟล์ด้วยบรรทัดที่ตรงกับนิพจน์

egrep

egrep เป็นตัวย่อที่ย่อมาจาก "Extended Global Expressions Print"

'E' ใน egrep หมายถึงถือว่ารูปแบบเป็นนิพจน์ปกติ "นิพจน์ทั่วไปแบบขยาย" ตัวย่อ 'ERE' ถูกเปิดใช้งานใน egrep egrep (ซึ่งเป็นเช่นเดียวกับgrep -E) ขนม+, ?, |, (และ)เป็นตัวละครเมตา

ในการแสดงออกขั้นพื้นฐานปกติ (มี grep), ตัวละครเมตา?, +, {, |, (และ)สูญเสียความหมายพิเศษของพวกเขา หากคุณต้องการ grep ในการรักษาตัวละครเหล่านี้เป็นตัวละคร-เมตาหลบหนีพวกเขา \?, \+, \{, \|, และ \(\)

ตัวอย่างเช่น grep ที่นี่ใช้นิพจน์ปกติพื้นฐานโดยที่เครื่องหมายบวกถือว่าเป็นจริงบรรทัดใด ๆ ที่มีเครื่องหมายบวกจะถูกส่งคืน

grep "+" myfile.txt

egrep ในทางกลับกันถือว่า "+" เป็นอักขระเมตาและส่งกลับทุกบรรทัดเนื่องจากเครื่องหมายบวกถูกตีความว่าเป็น "หนึ่งครั้งหรือมากกว่า"

egrep "+" myfile.txt

ที่นี่ทุกบรรทัดจะถูกส่งคืนเนื่องจาก+ถูกจัดการโดย egrep เป็นอักขระเมตา grep ปกติจะค้นหาเฉพาะบรรทัดที่มีตัวอักษร+เท่านั้น

fgrep

fgrep เป็นตัวย่อที่ย่อมาจาก "การพิมพ์นิพจน์ทั่วไปทั่วโลกคงที่สตริง"

fgrep (ซึ่งเป็นเช่นเดียวกับ grep -F) ได้รับการแก้ไขหรือรวดเร็ว grep และทำงานเป็น grep แต่ไม่รู้จักการแสดงออก meta-อักขระปกติใด ๆ ว่าเป็นพิเศษ การค้นหาจะเสร็จเร็วขึ้นเพราะจะประมวลผลสตริงธรรมดาแทนที่จะเป็นรูปแบบที่ซับซ้อน

ตัวอย่างเช่นหากฉันต้องการค้นหา. bash_profile สำหรับจุดตามตัวอักษร (.) การใช้ grep จะเป็นเรื่องยากเพราะฉันจะต้องหลบหนีจุดเนื่องจากจุดนั้นเป็นอักขระเมตาที่หมายถึง 'wild-card ตัวอักษรใด ๆ ':

grep "." myfile.txt

คำสั่งดังกล่าวส่งคืน myfile.txt ทุกบรรทัด ทำสิ่งนี้แทน:

fgrep "." myfile.txt

จากนั้นเฉพาะบรรทัดที่มีตัวอักษร '' ' ในพวกเขาจะถูกส่งกลับ fgrep ช่วยให้เราไม่ต้องหลบหนีจากตัวละครเมตาดาต้าของเรา

pgrep

pgrep เป็นตัวย่อที่ย่อมาจาก "ID กระบวนการพิมพ์นิพจน์ทั่วไปทั่วโลก"

pgrep จะค้นหากระบวนการที่กำลังทำงานอยู่และแสดง ID กระบวนการที่ตรงกับเกณฑ์การเลือกไปยัง stdout pgrep มีประโยชน์เมื่อสิ่งที่คุณต้องการทราบคือจำนวนเต็ม id กระบวนการของกระบวนการ ตัวอย่างเช่นถ้าฉันต้องการทราบเฉพาะ ID กระบวนการของกระบวนการ mysql ของฉันฉันจะใช้คำสั่งpgrep mysqlซึ่งจะส่งคืน ID กระบวนการเช่น 7312


จากpgrepคู่มือ : ชื่อกระบวนการที่ใช้สำหรับการจับคู่จะถูก จำกัด 15 ตัวอักษรที่มีอยู่ในการส่งออกของ/ proc / pid / สถิติ ใช้ตัวเลือก -f เพื่อให้ตรงกับบรรทัดคำสั่งที่สมบูรณ์/ proc / pid / cmdline
ปาโบล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.