Apa perbedaan antara grep, pgrep, egrep, fgrep?

55

Aku ingin berjalan-jalan melalui tentang perbedaan antara grep, pgrep, egrep, dan fgrepdan bagaimana saya akan menggunakannya.

Eric Leschinski
sumber
1
Pertanyaan ini sudah memiliki jawaban yang bagus di situs ini. unix.stackexchange.com/questions/17949/…
Ali786
Dan ada juga skrip bash sgrep :-).
pevik

Jawaban:

85

Perbedaan antara grep, pgrep, egrep, dan fgrep (Linux):

grep

grep adalah akronim yang merupakan kependekan dari "Global Regular Expressions Print". grep adalah program yang memindai file tertentu atau file per baris, mengembalikan baris yang berisi pola. Pola adalah ekspresi yang menentukan serangkaian string dengan menafsirkan karakter sebagai meta-karakter. Misalnya karakter meta tanda bintang (*) ditafsirkan sebagai makna "nol atau lebih dari elemen sebelumnya". Ini memungkinkan pengguna untuk mengetik serangkaian karakter pendek dan karakter meta ke dalam perintah grep agar komputer menunjukkan kepada kita baris apa yang cocok dengan file.

Perintah grep standar terlihat seperti:

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

grep mencetak hasil pencarian ke layar (stdout) dan mengembalikan nilai keluar berikut:

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).

Beberapa flag umum adalah: -cuntuk menghitung jumlah kecocokan yang berhasil dan tidak mencetak kecocokan yang sebenarnya, -iuntuk membuat case pencarian tidak sensitif, -nuntuk mencetak nomor baris sebelum setiap print cocok, -vuntuk mengambil pelengkap dari ekspresi reguler (yaitu mengembalikan garis yang tidak cocok), dan -luntuk mencetak nama file file dengan garis yang cocok dengan ekspresi.

egrep

egrep adalah akronim yang merupakan singkatan dari "Extended Global Regular Expressions Print".

'E' dalam egrep berarti memperlakukan pola sebagai ekspresi reguler. "Extended Regular Expressions" disingkat 'ERE' diaktifkan di egrep. egrep (yang sama dengan grep -E) memperlakukan +, ?, |, (, dan )sebagai meta-karakter.

Dalam ekspresi reguler dasar (dengan grep), meta-karakter ?, +, {, |, (, dan )kehilangan makna khusus mereka. Jika Anda ingin grep untuk mengobati karakter ini sebagai meta-karakter, melarikan diri mereka \?, \+, \{, \|, \(, dan \).

Misalnya, di sini grep menggunakan persamaan reguler dasar di mana plus diperlakukan secara literal, setiap baris dengan plus di dalamnya dikembalikan.

grep "+" myfile.txt

egrep di sisi lain memperlakukan "+" sebagai karakter meta dan mengembalikan setiap baris karena plus ditafsirkan sebagai "satu atau lebih kali".

egrep "+" myfile.txt

Di sini setiap baris dikembalikan karena +diperlakukan oleh egrep sebagai karakter meta. grep normal akan mencari hanya baris dengan literal +.

fgrep

fgrep adalah singkatan dari "Fixed-string Global Regular Expressions Print".

fgrep (yang sama dengan grep -F) adalah tetap atau cepat grep dan berperilaku sebagai grep tetapi TIDAK mengenali meta-karakter ekspresi reguler sebagai istimewa. Pencarian akan selesai lebih cepat karena hanya memproses string sederhana daripada pola yang rumit.

Misalnya, jika saya ingin mencari .bash_profile saya untuk titik literal (.) Maka menggunakan grep akan sulit karena saya harus melarikan diri dari titik karena titik adalah karakter meta yang berarti 'wild-card, sembarang karakter tunggal':

grep "." myfile.txt

Perintah di atas mengembalikan setiap baris myfile.txt. Lakukan ini sebagai gantinya:

fgrep "." myfile.txt

Maka hanya garis-garis yang memiliki literal '.' di dalamnya dikembalikan. fgrep membantu kita tidak repot-repot keluar dari karakter meta kita.

pgrep

pgrep adalah akronim yang merupakan singkatan dari "Process-ID Global Regular Expressions Print".

pgrep melihat melalui proses yang sedang berjalan dan mencantumkan ID proses yang cocok dengan kriteria seleksi untuk stdout. pgrep sangat berguna ketika semua yang ingin Anda ketahui adalah proses id integer dari suatu proses. Misalnya, jika saya hanya ingin mengetahui ID proses dari proses mysql saya, saya akan menggunakan perintah pgrep mysqlyang akan mengembalikan ID proses seperti 7312.

Eric Leschinski
sumber
Dari pgrepmanual : Nama proses yang digunakan untuk pencocokan terbatas pada 15 karakter yang ada di output dari / proc / pid / stat . Gunakan opsi -f untuk mencocokkan dengan baris perintah lengkap, / proc / pid / cmdline .
Pablo A