Cara Menggunakan Perintah grep di Linux
grep
Perintah 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 grep
arahan 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 ed
editor (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 ed
string 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 grep
sebilangan 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 grep
berdiam 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, grep
akan 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. ( -E
Pilihan menggantikan egrep
versi 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 grep
untuk mencocokkan salah satu watak yang terdapat dalam tanda kurung "[]." Ini bermaksud grep
akan 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/sudoers
failnya:
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
grep
bukan hanya mengenai teks, ia juga dapat memberikan maklumat berangka. Kita boleh grep
menghitung 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 grep
paparan 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.h
fail 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 grep
untuk 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 grep
program lain, dan grep
berada 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's
kemudahan carian.
Jika kita paip output dari grep
ke dalam wc
dan menggunakan -l
pilihan (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 ls
memasukkan grep
output dari grep
dalam 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
ls
senarai 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
grep
adalah alat yang hebat untuk anda gunakan. Ini bermula dari tahun 1974 dan masih kuat kerana kita memerlukannya, dan tidak ada yang lebih baik.
Bergandingan grep
dengan beberapa ungkapan biasa-fu benar-benar membawanya ke tahap seterusnya.
BERKAITAN: Cara Menggunakan Ungkapan Biasa Asas untuk Mencari Lebih Baik dan Menjimatkan Masa