it-swarm-id.com

Apa perbedaan antara `grep`,` egrep`, dan `fgrep`?

Adakah yang bisa memberi tahu saya perbedaan teknis antara grep, egrep, dan fgrep dan memberikan contoh yang sesuai?

Kapan saya harus menggunakan grep lebih dari egrep dan sebaliknya?

287
mr_eclair
  • egrep adalah 100% setara dengan grep -E
  • fgrep adalah 100% setara dengan grep -F

Secara historis switch ini disediakan dalam biner yang terpisah. Pada beberapa sistem Unix yang sangat lama Anda akan menemukan bahwa Anda perlu memanggil binari yang terpisah, tetapi pada semua sistem modern sakelar lebih disukai. Halaman manual untuk grep memiliki perincian tentang ini.

Adapun apa yang mereka lakukan, -E beralih grep ke mode khusus sehingga ekspresi dievaluasi sebagai ERE (Extended Regular Expression) yang bertentangan dengan pencocokan pola normal. Detail sintaksis ini ada di halaman manual.

-E, --extended-regexp
Menafsirkan POLA sebagai ungkapan reguler yang diperluas

-F sakelar beralih grep ke mode berbeda di mana ia menerima pola yang cocok, tetapi kemudian memecah pola itu menjadi satu string pencarian per baris dan melakukan pencarian OR pada salah satu string tanpa melakukan pencocokan pola khusus.

-F, --fixed-strings
Menafsirkan POLA sebagai daftar string tetap, dipisahkan oleh baris baru, yang mana saja yang harus dicocokkan.

Berikut ini beberapa contoh skenario:

  • Anda memiliki file dengan daftar katakanlah sepuluh nama pengguna Unix dalam teks biasa. Anda ingin mencari file grup di mesin Anda untuk melihat apakah ada di antara sepuluh pengguna yang terdaftar di grup khusus:

    grep -F -f user_list.txt /etc/group
    

    Alasannya -F switch membantu di sini adalah bahwa nama pengguna di file pola Anda ditafsirkan sebagai string teks biasa. Dots misalnya akan diartikan sebagai dots daripada wild-card.

  • Anda ingin mencari menggunakan ekspresi mewah. Misalnya tanda kurung () dapat digunakan untuk menunjukkan grup dengan | digunakan sebagai operator OR. Anda dapat menjalankan pencarian ini menggunakan -E:

    grep -E '^no(fork|group)' /etc/group
    

    ... untuk mengembalikan garis yang dimulai dengan "nofork" atau "nogroup". Tanpa -E switch Anda harus keluar dari karakter khusus yang terlibat karena dengan pencocokan pola normal mereka hanya akan mencari pola yang tepat;

    grep '^no\(fork\|group\)' /etc/group
    
304
Caleb

Dari man grep:

 egrep sama dengan grep -E. 
 fgrep sama dengan grep -F. Doa langsung sebagai egrep atau 
 Fgrep sudah usang, tetapi disediakan untuk memungkinkan aplikasi historis 
 Yang mengandalkannya untuk menjalankannya tanpa dimodifikasi. 

Anda menggunakan fgrep atau grep -F jika Anda jangan ingin agar grepped string diinterpretasikan sebagai sebuah pola.

Anda menggunakan egrep atau grep -E jika Anda perlu menggunakan regexp tambahan.

33
rozcietrzewiacz

egrep dan fgrep pada dasarnya setara dengan grep -E dan grep -F (masing-masing):

   -E, --extended-regexp
          Interpret PATTERN as an extended regular  expression  (ERE,  see
          below).  (-E is specified by POSIX.)

   -F, --fixed-strings
          Interpret  PATTERN  as  a  list  of  fixed strings, separated by
          newlines, any of which is to be matched.  (-F  is  specified  by
          POSIX.)

Pesan kesalahan mungkin berbeda.

15

Dari "man grep":

tiga varian program egrep, fgrep dan rgrep tersedia. egrep sama dengan grep -E. fgrep sama dengan grep -F. rgrep sama dengan grep -r. Doa langsung baik sebagai egrep atau fgrep sudah usang, tetapi disediakan untuk memungkinkan aplikasi historis yang bergantung pada mereka untuk berjalan tanpa dimodifikasi.

8
Rufo El Magufo

Jika Anda mencari string kata demi kata, dan ingin memastikan bahwa string yang Anda sampaikan ditafsirkan secara kata demi kata (mis. Tanpa risiko yang mengatakan titik atau tanda tanya akan ditafsirkan sebagai sesuatu yang lain) gunakan fgrep atau egrep -F.

Adapun perbedaan antara egrep dan grep, saya pikir egrep adalah waktu yang paling Anda inginkan. The GNU situs manual daftar perbedaan antara grep dan egrep yang tampaknya terletak pada sintaksis: beberapa hal memerlukan garis miring sedangkan yang lain tidak. Saya pikir egrep lebih "kompatibel" dengan Perl regexps dan javascript regexps sehingga lebih mudah bagi saya untuk menggunakan egrep.

Btw. Saya benar-benar mendorong Anda untuk memberikan ack coba - ini mendukung PREGs, dan memiliki lebih banyak default yang berguna (yaitu mewarnai, melewatkan direktori yang mungkin bukan yang Anda inginkan seperti .svn, kemampuan untuk mengikuti symlink, dan sedikit lebih mudah untuk mengetik ack daripada grep -E).

3
qbolec