Bisa ada yang bilang saya perbedaan teknis antara grep
, egrep
, dan fgrep
dan memberikan contoh yang cocok?
Kapan saya perlu menggunakan grep
lebih egrep
dan sebaliknya?
grep
regular-expression
mr_eclair
sumber
sumber
Jawaban:
egrep
adalah 100% setara dengangrep -E
fgrep
adalah 100% setara dengangrep -F
Secara historis switch ini disediakan dalam biner yang terpisah. Pada beberapa sistem Unix yang benar-benar tua 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.The
-F
beralih beralih grep menjadi modus yang berbeda di mana ia menerima pola untuk mencocokkan, tapi kemudian membagi pola yang menjadi satu string pencarian per baris dan melakukan pencarian OR pada salah satu string tanpa melakukan pencocokan pola khusus.Berikut ini beberapa contoh skenario:
Anda memiliki file dengan daftar katakanlah 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:
Alasan
-F
saklar membantu di sini adalah bahwa nama pengguna dalam 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 yang|
digunakan sebagai operator OR. Anda dapat menjalankan pencarian ini menggunakan-E
:... untuk mengembalikan garis yang dimulai dengan "nofork" atau "nogroup". Tanpa
-E
saklar Anda harus melarikan diri dari karakter khusus yang terlibat karena dengan pencocokan pola normal mereka hanya akan mencari pola yang tepat;sumber
egrep
ataufgrep
;-E
dan-F
standar. Sebenarnya ada ketidakcocokan kecil diegrep
: itu memperlakukan{
sedikit berbeda.fgrep
menggunakan backend Aho-Corasick, sementaragrep
menggunakan versi modifikasi dari Commentz-Walter. Ini berartigrep
memiliki kompleksitas kasus terburuk O (mn) danfgrep
O terburuk (m + n).egrep
dangrep -E
ditangani oleh berbagai executable, BusyBox dan BSD grep. Kedua varian memiliki perbedaan perilaku untuk konstruksi regex non-Posix, seperti\s
. Ini menyebabkan banyak kebingungan ...Dari
man grep
:Anda menggunakan
fgrep
ataugrep -F
jika Anda tidak ingin grepped string ditafsirkan sebagai suatu pola.Anda menggunakan
egrep
ataugrep -E
jika Anda perlu menggunakan regexp tambahan.sumber
egrep
danfgrep
pada dasarnya setara dengangrep -E
dangrep -F
(masing-masing):Pesan kesalahan mungkin berbeda.
sumber
Dari "man grep":
sumber
Jika Anda mencari string kata demi kata, dan ingin memastikan bahwa string yang Anda sampaikan ditafsirkan secara kata demi kata (yaitu 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. Situs manual GNU mencantumkan 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 mencoba ACK - mendukung PREG, dan memiliki standar yang lebih berguna (yaitu mewarnai, melewatkan direktori yang mungkin bukan yang Anda inginkan seperti .svn, kemampuan untuk mengikuti symlink, dan sedikit lebih mudah untuk mengetik ack dari grep -E).
sumber