Cara Menggunakan Perintah grep di Linux

grepPerintah Linux adalah utiliti pemadanan rentetan dan corak yang memaparkan garis yang sepadan dari pelbagai fail. Ia juga berfungsi dengan output paip dari perintah lain. Kami menunjukkan kepada anda bagaimana.

Kisah Di Sebalik Grep

The greparahan terkenal di Linux dan Unix kalangan untuk tiga sebab. Pertama, sangat berguna. Kedua, banyak pilihan boleh menjadi luar biasa. Ketiga, ditulis semalam untuk memenuhi keperluan tertentu. Dua yang pertama dihidupkan; yang ketiga sedikit.

Ken Thompson telah mengekstrak kemampuan pencarian ekspresi biasa dari ededitor (diucapkan ee-dee) dan membuat program kecil - untuk kegunaannya sendiri - untuk mencari melalui fail teks. Ketua jabatannya di Bell Labs, Doug Mcilroy, mendekati Thompson dan menggambarkan masalah yang dihadapi salah seorang rakannya, Lee McMahon.

McMahon cuba mengenal pasti pengarang makalah Federalist melalui analisis teks. Dia memerlukan alat yang dapat mencari frasa dan rentetan dalam fail teks. Thompson menghabiskan kira-kira satu jam pada malam itu menjadikan alatnya utiliti umum yang dapat digunakan oleh orang lain dan menamakannya semula sebagai grep. Dia mengambil nama dari edstring perintah g/re/p, yang diterjemahkan sebagai "pencarian ekspresi biasa global."

Anda dapat menonton Thompson bercakap dengan Brian Kernighan mengenai kelahiran grep.

Pencarian Ringkas Dengan grep

Untuk mencari rentetan dalam fail, lulus istilah carian dan nama fail pada baris perintah:

Garisan pemadanan dipaparkan. Dalam kes ini, ia adalah satu baris. Teks yang sepadan diserlahkan. Ini kerana pada grepsebilangan besar pengedaran disamakan dengan:

alias grep = "grep --colour = auto"

Mari lihat hasilnya di mana terdapat banyak garis yang sepadan. Kami akan mencari kata "Rata-rata" dalam fail log aplikasi. Oleh kerana kita tidak dapat mengingat jika kata tersebut ditulis dengan huruf kecil dalam fail log, kita akan menggunakan pilihan -i (abaikan huruf besar):

grep -i Purata geek-1.log

Setiap baris yang sesuai ditampilkan, dengan teks yang sesuai disorot di masing-masing.

Kita boleh memaparkan garis yang tidak sepadan dengan menggunakan pilihan -v (invert match).

grep -v Mem geek-1.log

Tidak ada penekanan kerana ini adalah garis yang tidak sepadan

Kita boleh grepberdiam diri. Hasilnya dihantar ke shell sebagai nilai kembali dari grep. Hasil sifar bermaksud tali itu dijumpai, dan hasil dari satu bermaksud tali itu tidak dijumpai. Kami dapat memeriksa kod pengembalian menggunakan  $?parameter khas:

grep -q purata geek-1.log
bergema $?
grep -q howtogeek geek-1.log
bergema $?

Carian Rekursif Dengan grep

Untuk mencari melalui direktori dan subdirektori bersarang, gunakan pilihan -r (recursive). Perhatikan bahawa anda tidak memberikan nama fail pada baris perintah, anda mesti memberikan jalan. Di sini kita mencari di direktori semasa "." dan mana-mana subdirektori:

grep -r -i memfree.

Output merangkumi direktori dan nama fail setiap baris yang sepadan

Kita boleh membuat  grep  pautan simbolik dengan menggunakan pilihan -R(recursive dereference). Kami mempunyai pautan simbolik dalam direktori ini, yang dipanggil logs-folder. Ia menunjukkan /home/dave/logs.

ls -l log-folder

Mari ulangi carian terakhir kami dengan pilihan  -R(recursive dereference):

grep -R -i memfree.

Pautan simbolik diikuti dan direktori yang ditunjuk juga dicari grep.

Mencari Keseluruhan Perkataan

Secara lalai, grepakan memadankan garis jika sasaran carian muncul di mana-mana baris itu, termasuk di dalam rentetan lain. Lihat contoh ini. Kami akan mencari perkataan "percuma."

grep -i geek-1.log percuma

Hasilnya adalah garis yang mempunyai string "bebas" di dalamnya, tetapi itu bukan perkataan yang terpisah. Mereka adalah sebahagian daripada rentetan "MemFree."

Untuk memaksa grep untuk memadankan "kata" yang terpisah sahaja, gunakan pilihan -w(kata regexp).

grep -w -i geek-1.log percuma
bergema $?

Kali ini tidak ada hasil karena istilah pencarian "gratis" tidak muncul dalam file sebagai kata terpisah.

Menggunakan Istilah Carian Pelbagai

Pilihan -E(regexp diperpanjang) membolehkan anda mencari beberapa perkataan. ( -EPilihan menggantikan egrepversi yang tidak digunakan lagi grep.)

Perintah ini mencari dua istilah carian, "rata-rata" dan "memfree."

grep -E -w -i "rata-rata | memfree" geek-1.log

Semua garis yang sesuai dipaparkan untuk setiap istilah carian.

Anda juga boleh mencari beberapa istilah yang tidak semestinya keseluruhan kata, tetapi juga boleh menjadi keseluruhan kata.

Pilihan -e(corak) membolehkan anda menggunakan beberapa istilah carian pada baris perintah. Kami menggunakan ciri kurungan ekspresi biasa untuk membuat corak carian. Ini memberitahu grepuntuk mencocokkan salah satu watak yang terdapat dalam tanda kurung "[]." Ini bermaksud grepakan sesuai dengan "kB" atau "KB" ketika ia mencari.

Kedua tali itu dipadankan, dan, sebenarnya, beberapa baris mengandungi kedua-dua tali.

Garisan Padan Tepat

Garis  -x(baris regexp) hanya akan sepadan dengan garis di mana keseluruhan garis sepadan dengan istilah carian. Mari cari cap tarikh dan masa yang kita tahu hanya muncul sekali dalam fail log:

grep -x "20-Jan - 06 15:24:35" geek-1.log

Garis tunggal yang sepadan dijumpai dan dipaparkan.

Sebaliknya hanya menunjukkan garis yang tidak sepadan. Ini boleh berguna semasa anda melihat fail konfigurasi. Komen sangat bagus, tetapi kadang-kadang sukar untuk melihat tetapan sebenar di antara mereka semua. Inilah /etc/sudoersfailnya:

Kami dapat menyaring baris komen dengan berkesan seperti ini:

sudo grep -v "#" / etc / sudoers

Itu lebih senang dihuraikan.

Hanya Memaparkan Teks yang Sesuai

Mungkin ada saat ketika Anda tidak ingin melihat keseluruhan garis pencocokan, hanya teks yang sesuai. Pilihan -o(hanya sepadan) hanya berlaku.

grep -o MemFree geek-1.log

Paparan dikurangkan untuk menunjukkan hanya teks yang sesuai dengan istilah carian, dan bukannya keseluruhan garis yang sesuai.

Mengira Dengan grep

grepbukan hanya mengenai teks, ia juga dapat memberikan maklumat berangka. Kita boleh grepmenghitung dengan pelbagai cara. Sekiranya kita ingin mengetahui berapa kali istilah carian muncul dalam fail, kita boleh menggunakan pilihan -c(hitung).

grep -c purata geek-1.log

grep melaporkan bahawa istilah carian muncul 240 kali dalam fail ini.

Anda boleh membuat greppaparan nombor garis untuk setiap baris yang sesuai dengan menggunakan pilihan -n(nombor baris)

grep -n Jan geek-1.log

Nombor garis untuk setiap garis yang sepadan ditunjukkan pada permulaan garis.

Untuk mengurangkan jumlah hasil yang ditampilkan, gunakan pilihan -m(jumlah maksimum). Kami akan menghadkan output kepada lima baris yang sepadan:

grep -m5 -n Jan geek-1.log

Menambah Konteks

Mampu melihat beberapa baris tambahan - mungkin garis yang tidak sepadan - untuk setiap garis yang sepadan sering berguna. ia dapat membezakan garis manakah yang sesuai dengan yang anda minati.

Untuk menunjukkan beberapa baris selepas garis yang sesuai, gunakan pilihan -A (selepas konteks). Kami meminta tiga baris dalam contoh ini:

grep -A 3 -x "20-Jan-06 15:24:35" geek-1.log

Untuk melihat beberapa garis dari sebelum garis yang sepadan, gunakan pilihan -B(konteks sebelum).

grep -B 3 -x "20-Jan-06 15:24:35" geek-1.log

Dan untuk memasukkan garis dari sebelum dan sesudah garis pemadanan, gunakan pilihan -C(konteks).

grep -C 3 -x "20-Jan-06 15:24:35" geek-1.log

Menunjukkan Fail yang Sesuai

Untuk melihat nama fail yang mengandungi istilah pencarian, gunakan pilihan -l (fail dengan padanan). Untuk mengetahui fail kod sumber C yang berisi rujukan ke sl.hfail tajuk, gunakan arahan ini:

grep -l "sl.h" * .c

Nama fail disenaraikan, bukan garis yang sepadan.

Dan tentu saja, kita dapat mencari fail yang tidak mengandungi istilah carian. Pilihan -L(fail tanpa padanan) hanya berlaku.

grep -L "sl.h" * .c

Permulaan dan Akhir Garisan

Kita boleh memaksa grepuntuk hanya memaparkan perlawanan yang berada di awal atau akhir baris. Pengendali ekspresi biasa “^” sesuai dengan permulaan garis. Hampir semua baris dalam fail log akan mengandungi ruang, tetapi kami akan mencari baris yang mempunyai ruang sebagai watak pertama:

grep "^" geek-1.log

Garis-garis yang mempunyai spasi sebagai watak pertama — di awal baris — ditampilkan.

Untuk mencocokkan hujung baris, gunakan operator ekspresi biasa "$". Kami akan mencari garis yang diakhiri dengan "00."

grep "00 $" geek-1.log

Paparan menunjukkan garis yang memiliki "00" sebagai watak terakhir mereka.

Menggunakan Paip dengan grep

Sudah tentu, anda boleh memasukkan input ke grep, memasukkan output dari grepprogram lain, dan grepberada di tengah-tengah rantai paip.

Katakanlah kita ingin melihat semua kejadian rentetan "ExtractParameters" dalam fail kod sumber C kami. Kami tahu akan ada beberapa, jadi kami memasukkan output ke less:

grep "ExtractParameters" * .c | kurang

Keluaran ditunjukkan dalam less.

Ini membolehkan anda membaca senarai fail dan menggunakan less'skemudahan carian.

Jika kita paip output dari grepke dalam wcdan menggunakan -lpilihan (baris), kita boleh mengira bilangan baris dalam fail kod sumber yang mengandungi "ExtractParameters". (Kami dapat mencapainya menggunakan pilihan grep-c(hitung), tetapi ini adalah cara yang rapi untuk menunjukkan keluarnya grep.)

grep "ExtractParameters" * .c | wc -l

Dengan perintah seterusnya, kita mengalihkan output dari dan lsmemasukkan grepoutput dari grepdalam sort. Kami menyenaraikan fail di direktori semasa, memilih file dengan rentetan "Aug" di dalamnya, dan menyusunnya mengikut ukuran fail:

ls -l | grep "Ogos" | urutkan + 4n

Mari kita memecahkannya:

  • ls -l : Lakukan penyenaraian format panjang menggunakan fail ls.
  • grep "Aug" : Pilih garis dari lssenarai yang mempunyai "Aug" di dalamnya. Perhatikan bahawa ini juga akan mencari fail yang memiliki "Aug" dalam nama mereka.
  • urutkan + 4n : Susun output dari grep pada lajur keempat (ukuran fail).

Kami mendapat senarai tersusun dari semua fail yang diubah pada bulan Ogos (tidak kira tahun), mengikut urutan menaik saiz fail.

BERKAITAN: Cara Menggunakan Paip di Linux

grep: Kurang Komando, Lebih dari Sekutu

grepadalah alat yang hebat untuk anda gunakan. Ini bermula dari tahun 1974 dan masih kuat kerana kita memerlukannya, dan tidak ada yang lebih baik.

Bergandingan grepdengan beberapa ungkapan biasa-fu benar-benar membawanya ke tahap seterusnya.

BERKAITAN: Cara Menggunakan Ungkapan Biasa Asas untuk Mencari Lebih Baik dan Menjimatkan Masa