Dari man grephalaman (di Debian):
DESKRIPSI
grep searches the named input FILEs (or standard input if no files are
named, or if a single hyphen-minus (-) is given as file name) for lines
containing a match to the given PATTERN. By default, grep prints the
matching lines.
Dalam kasus pertama, grepbuka file; di yang kedua, shell membuka file dan menugaskannya ke input standar grep, dan greptidak meneruskan argumen nama file mengasumsikan perlu untuk menerima input standarnya.
Kelebihan 1:
grep dapat mengambil lebih dari satu file¹.
grepdapat menampilkan nama file di mana setiap kemunculan lineditemukan.
Kelebihan 2:
- Jika file tidak dapat dibuka, shell mengembalikan kesalahan yang akan mencakup informasi yang lebih relevan (seperti nomor baris dalam skrip) dan dengan cara yang lebih konsisten (jika Anda membiarkan shell membuka file untuk perintah lain juga) daripada saat
grepmembukanya. Dan jika file tidak dapat dibuka, grepbahkan tidak dipanggil (yang untuk beberapa perintah - mungkin tidak grep- dapat membuat perbedaan besar).
- di
grep line < in > out, jika intidak bisa dibuka, outtidak akan dibuat atau terpotong.
- Tidak ada masalah dengan beberapa file dengan nama yang tidak biasa (seperti
-atau nama file yang dimulai dengan -) ².
- kosmetik: Anda dapat menempatkan di
<filemana saja di baris perintah untuk menunjukkan aliran perintah lebih alami, seperti <in grep line >outjika Anda suka.
kosmetik: dengan GNU grep, Anda dapat memilih label apa yang akan digunakan di depan baris yang cocok alih-alih hanya nama file seperti di:
<file grep --label='Found in file at line' -Hn line
Dalam hal kinerja, jika file tidak dapat dibuka, Anda menyimpan eksekusi grepketika menggunakan redirection, tetapi sebaliknya grepsaya tidak berharap banyak perbedaan.
Dengan redirection, Anda menyimpan harus melewati argumen tambahan grep, Anda membuat grepparsing sedikit lebih mudah. Di sisi lain, shell akan membutuhkan (setidaknya) panggilan sistem tambahan ke dup2()deskriptor file ke deskriptor file 0.
Dalam { grep -m1 line; next command; } < file, grep(di sini GNU grep) akan ingin seek()kembali ke tepat setelah baris yang cocok sehingga next commandmelihat sisa file (itu juga akan perlu menentukan apakah file tersebut dapat dicari atau tidak). Dengan kata lain, posisi dalam stdin adalah salah satu dari grepoutput. Dengan grep -m1 line file, itu bisa mengoptimalkan itu, itu satu hal yang lebih sedikit untuk grepdiperhatikan.
Catatan
¹ Dengan zsh, Anda dapat melakukan:
grep line < file1 < file2
tetapi melakukan hal yang setara cat file1 file2 | grep line(tanpa menjalankan catutilitas) dan jadi kurang efisien, dapat menyebabkan kebingungan jika file pertama tidak berakhir dengan karakter baris baru dan tidak akan memberi tahu Anda di mana file pola ditemukan.
² Dalam kasus ksh93dan bashmeskipun, ada file seperti /dev/tcp/host/port(dan /dev/fd/xpada beberapa sistem di bash) yang, ketika digunakan dalam target pengalihan shell memotong untuk tujuan khusus bukannya benar-benar membuka file pada sistem file (meskipun umumnya, file-file itu tidak ada pada sistem file). /dev/stdinmelayani tujuan yang sama seperti yang -dikenali oleh grep, tetapi setidaknya, di sini lebih tepat namespace (siapa pun dapat membuat file yang disebut -dalam direktori apa pun, sementara hanya administrator yang dapat membuat file yang dipanggil /dev/tcp/host/portdan administrator harus tahu lebih baik).