Cara dengan benar GREP untuk teks dalam skrip bash
- 3287
- 594
- Daryl Hermiston DVM
grep
adalah utilitas Linux serbaguna, yang bisa memakan waktu beberapa tahun untuk dikuasai dengan baik. Bahkan insinyur Linux yang berpengalaman dapat membuat kesalahan dengan mengasumsikan file teks input yang diberikan akan memiliki format tertentu. grep
juga dapat digunakan, secara langsung dalam kombinasi dengan jika
Pencarian berbasis untuk memindai keberadaan string dalam file teks yang diberikan. Temukan cara dengan benar GREP untuk teks terlepas dari set karakter, cara menggunakan -Q
opsi untuk mengirim SMS untuk kehadiran string, dan banyak lagi!
Dalam tutorial ini Anda akan belajar:
- Cara melakukan pencarian teks set-independen karakter yang benar dengan grep
- Cara menggunakan pernyataan GREP lanjutan dari dalam skrip atau perintah oneliner terminal
- Cara menguji kehadiran string menggunakan
-Q
opsi untuk grep - Contoh yang menyoroti penggunaan GREP untuk kasus penggunaan ini
Persyaratan dan konvensi perangkat lunak yang digunakan
Kategori | Persyaratan, konvensi atau versi perangkat lunak yang digunakan |
---|---|
Sistem | Distribusi Linux-independen |
Perangkat lunak | Baris perintah bash, sistem berbasis Linux |
Lainnya | Utilitas apa pun yang tidak termasuk dalam shell bash secara default dapat diinstal menggunakan sudo apt-get install-name utilitas (atau instalasi yum untuk sistem berbasis redhat) |
Konvensi | # - mengharuskan Linux -Commands untuk dieksekusi dengan hak istimewa root baik secara langsung sebagai pengguna root atau dengan menggunakan sudo memerintah$-mengharuskan Linux-Commands untuk dieksekusi sebagai pengguna biasa |
Contoh 1: Pencarian teks set-independen karakter yang benar dengan grep
Apa yang Terjadi Saat Anda Menggerakkan File Yang Berbasis Teks/Karakter, tetapi berisi karakter khusus di luar kisaran normal? Ini berpotensi terjadi ketika file berisi set karakter yang kompleks atau tampaknya berisi konten seperti biner. Untuk memahami ini lebih baik, pertama -tama kita perlu memahami apa itu data biner.
Sebagian besar (tetapi tidak semua) komputer menggunakan pada tingkat paling dasarnya hanya dua negara: 0 dan 1. Mungkin lebih disederhanakan dapatkah Anda dapat memikirkan ini seperti sakelar: 0 tidak ada volt, tidak ada daya, dan 1 adalah "beberapa tingkat tegangan" atau dimakamkan. Komputer modern dapat memproses jutaan dari 0 dan 1 ini dalam sepersekian detik. Ini adalah status 0/1 disebut 'bit' dan merupakan sistem numerik dasar-2 (seperti sistem desimal 0-9 kami adalah sistem numerik basis-10). Ada cara lain untuk mewakili data berbasis bit/biner seperti octal (8-base: 0-7) dan hexadecimal (16-base: 0-f).
Kembali ke 'biner' (bin, ganda), Anda dapat mulai melihat bagaimana biasanya digunakan untuk menggambarkan semua jenis data yang tidak dapat dengan mudah dikenali oleh manusia, tetapi dapat dipahami dengan komputer berbasis biner. Ini mungkin bukan analogi terbaik, karena biner biasanya mengacu pada dua negara (Benar/Salah), sedangkan yang sama halnya jargon 'Data biner' telah menjadi data yang tidak mudah ditafsirkan dengan mudah diinterpretasikan.
Misalnya, file kode sumber yang dikompilasi dengan kompiler berisi Data biner Sebagian besar tidak dapat dibaca oleh manusia. Misalnya, file kode sumber yang dikompilasi dengan kompiler berisi Data biner kebanyakan tidak dapat dibaca oleh mata manusia. Contoh lain bisa berupa file terenkripsi atau file konfigurasi yang ditulis dalam format kepatutan.
Seperti apa rupa saat Anda mencoba dan melihat data biner?
Biasanya, saat melihat data biner untuk executable, Anda akan melihat beberapa data biner nyata (semua karakter yang terlihat aneh - komputer Anda menampilkan data biner dalam kemampuan format output terbatas yang didukung terminal Anda), serta beberapa output berbasis teks. Dalam kasus ls
Seperti yang terlihat di sini, mereka tampaknya menjadi nama fungsi di dalam ls
kode.
Untuk melihat data biner dengan benar, Anda benar -benar membutuhkan penampil file biner. Pemirsa semacam itu hanya memformat data dalam format asalnya, di samping kolom sisi berbasis teks. Ini menghindari keterbatasan output tekstual dan memungkinkan Anda untuk melihat kode komputer untuk apa sebenarnya: 0 dan 1, meskipun sering diformat dalam pemformatan heksadesimal (0-f atau 0-f seperti yang ditunjukkan di bawah).
Mari kita lihat dua set 4 baris kode biner ls
untuk melihat seperti apa ini:
$ hexdump -c /bin /ls | head -n4; echo '...'; hexdump -c /bin /ls | ekor -N131 | Kepala -N4 00000000 7F 45 4C 46 02 01 01 00 00 00 00 00 00 00 00 00 |.Peri… | 00000010 03 00 3E 00 01 00 00 00 D0 67 00 00 00 00 00 00 | ...> ... g… | 00000020 40 00 00 00 00 00 00 00 C0 23 02 00 00 00 00 00 |@… #… | 00000030 00 00 00 00 40 00 38 00 0D 00 40 00 1E 00 1D 00 |… @.8… @… |… 00022300 75 2e 76 65 72 73 69 6f 6e 00 2e 67 6e 75 2e 76 | u.Versi ... GNU.v | 00022310 65 72 73 69 6f 6e 5f 72 00 2e 72 65 6c 61 2e 64 | ersion_r… RelA.d | 00022320 79 6e 00 2e 72 65 6c 61 2e 70 6c 74 00 2e 69 6e | yn… rela.PLT… di | 00022330 69 74 00 2E 70 6C 74 2E 67 6F 74 00 2E 70 6C 74 | IT… PLT.Got… PLT |
Bagaimana semua ini (selain belajar lebih banyak tentang cara kerja komputer) membantu Anda memahami dengan benar grep
penggunaan? Mari kita kembali ke pertanyaan asli kita: Apa yang terjadi saat Anda melalui file yang berbasis teks/karakter, tetapi berisi karakter khusus di luar rentang normal?
Kami sekarang dapat dengan tepat menulis ulang ini ke 'apa yang terjadi saat Anda melalui file biner'? Reaksi pertama Anda mungkin: Mengapa saya ingin mencari melalui file biner?. Sebagian, jawabannya ditunjukkan di atas ls
contohnya sudah; Seringkali file biner masih berisi string berbasis teks.
Dan ada alasan yang jauh lebih penting dan utama; grep
Secara default akan mengasumsikan banyak file untuk berisi data biner segera setelah mereka memiliki karakter khusus di dalamnya, dan mungkin ketika mereka berisi urutan pelarian biner tertentu, meskipun file itu sendiri mungkin berbasis data. Yang lebih buruk adalah bahwa secara default GREP akan gagal dan membatalkan pemindaian file -file ini segera setelah data tersebut ditemukan:
$ head -n2 test_data.SQL Buat Tabel T1 (ID int); Masukkan ke dalam nilai T1 (1); $ grep 'insert' test_data.SQL | ekor -n2 Masukkan ke dalam nilai T1 (1000); File Biner Test_data.SQL Matches
Sebagai dua contoh penting dari pengalaman pribadi dengan pekerjaan database, ketika Anda memindai log kesalahan server database, yang dapat dengan mudah berisi karakter khusus seperti pesan kesalahan, database, tabel dan nama bidang dapat membuatnya ke log kesalahan dan pesan tersebut secara teratur dalam set karakter khusus wilayah.
Contoh lain adalah tes SQL yang diperoleh dari suite pengujian basis data (ditunjukkan pada contoh di atas). Data semacam itu sering kali berisi karakter khusus untuk menguji dan menekankan server dengan banyak cara. Hal yang sama berlaku untuk sebagian besar data pengujian situs web dan set data pengujian domain lainnya. Karena GREP gagal secara default terhadap data tersebut, penting untuk memastikan kami menambahkan opsi untuk GREP untuk menutupi ini.
Opsinya adalah --file biner = teks
. Kita dapat melihat bagaimana grep kita sekarang bekerja dengan benar:
$ grep 'insert' test_data.SQL | wc -l 7671 $ grep 'insert' test_data.SQL | ekor -N1 file biner test_data.SQL cocok dengan $ grep--biner-files = teks 'masukkan' test_data.SQL | WC -L 690427
Sungguh bedanya! Anda dapat membayangkan berapa banyak otomatis grep
Skrip di seluruh dunia gagal memindai semua data yang harus mereka pindai. Yang lebih buruk, dan secara signifikan menambah masalah adalah grep
Gagal 100% diam -diam ketika ini terjadi, kode kesalahan akan 0 (sukses) dalam kedua kasus:
$ grep -q 'masukkan' test_data.SQL; echo $? 0 $ grep - -Binary -Files = Text -Q 'Insert' test_data.SQL; echo $? 0
Memperparahnya lebih banyak lagi, pesan kesalahan ditampilkan stdout
output, dan tidak aktif Stderr
seperti yang mungkin diharapkan. Kami dapat memverifikasi ini dengan mengarahkan ulang Stderr
ke perangkat nol /dev/null
, hanya menampilkan stdout
keluaran. Output tetap:
$ grep 'insert' test_data.SQL 2>/dev/null | ekor -N1 file biner test_data.SQL Matches
Ini juga berarti bahwa jika Anda mengarahkan hasil GREP Anda ke file lain (> Somefile.txt
Setelah perintah grep), bahwa 'file biner ... cocok' sekarang akan menjadi bagian dari file itu, selain kehilangan semua entri yang terlihat setelah masalah tersebut terjadi.
Masalah lain adalah aspek keamanan: mari kita ambil organisasi yang telah menulis log akses grep ke laporan email ke sysadmin setiap kali agen nakal (seperti peretas) mencoba dan mengakses sumber daya yang tidak sah. Jika peretas seperti itu dapat memasukkan beberapa data biner ke dalam log akses sebelum upaya aksesnya, dan grep tidak terlindungi oleh --file biner = teks
, Tidak ada email seperti itu yang akan dikirim.
Bahkan jika skrip dikembangkan dengan cukup baik untuk memeriksa grep
Kode Keluar, masih belum ada yang akan melihat kesalahan skrip, karena Grep kembali 0
, atau dengan kata lain: sukses. Sukses itu bukan 🙂
Ada dua solusi mudah; menambahkan --file biner = teks
untuk semua Anda grep
pernyataan, dan Anda mungkin ingin mempertimbangkan pemindaian output GREP (atau isi file output yang dialihkan) untuk ekspresi reguler '^file biner.*cocok '. Untuk informasi lebih lanjut tentang ekspresi reguler, lihat Bash Regexps untuk pemula dengan contoh dan lanjutan Bash Regex dengan contoh -contoh. Namun, baik melakukan keduanya atau hanya yang pertama akan lebih disukai, karena opsi kedua tidak tahan masa depan; Teks 'file biner ... cocok' dapat berubah.
Akhirnya, perhatikan bahwa ketika file teks menjadi rusak (kegagalan disk, kegagalan jaringan dll.), Isi itu mungkin berakhir menjadi bagian-teks dan sebagian biner. Ini adalah alasan lain untuk selalu melindungi Anda grep
pernyataan dengan --file biner = teks
pilihan.
TL; DR: Menggunakan --file biner = teks
untuk semua Anda grep
pernyataan, bahkan jika mereka saat ini bekerja dengan baik. Anda tidak pernah tahu kapan data biner itu dapat mengenai file Anda.
Contoh 2: Tes untuk keberadaan string yang diberikan dalam file teks
Kita bisa gunakan grep -q
dalam kombinasi dengan jika
Pernyataan untuk menguji keberadaan string yang diberikan dalam file teks:
$ if grep - -binery -files = text -qi "masukkan" test_data.SQL; lalu gema "ditemukan!"; kalau tidak gema" tidak ditemukan!"; fi ditemukan!
Mari kita hancurkan sedikit dengan pertama -tama memeriksa apakah data benar -benar ada:
$ grep - -Binary -Files = teks -i "masukkan" test_data.SQL | head -n1 Masukkan ke dalam nilai T1 (1);
Di sini kami menjatuhkan Q
Opsi (tenang) untuk mendapatkan output dan melihat bahwa string 'insert' - diambil dengan cara yang tidak sensitif (dengan menentukan -Saya
opsi untuk grep
ada dalam file sebagai 'masukkan ...'.
Perhatikan bahwa Q
Opsi tidak secara khusus a pengujian pilihan. Ini lebih merupakan pengubah output yang memberi tahu grep
menjadi 'diam', saya.e. bukan untuk mengeluarkan apapun. Jadi bagaimana cara jika
Pernyataan tahu apakah ada keberadaan string yang diberikan dalam file teks? Ini dilakukan melalui grep
Kode Keluar:
$ grep - -Binary -Files = teks -i "masukkan" test_data.SQL 2> & 1>/dev/null; echo $? 0 $ grep - -Binary -files = Teks -i "Ini benar -benar tidak ada" test_data.SQL 2> & 1>/dev/null; echo $? 1
Di sini kami melakukan pengalihan manual dari semuanya Stderr
Dan sdtout
output ke /dev/null
dengan mengarahkan ulang Stderr
(2>
) ke stdout
(& 1) dan mengarahkan semua stdout
output ke perangkat nol (>/dev/null
). Ini pada dasarnya setara dengan -Q
Opsi (tenang) untuk grep.
Kami selanjutnya memverifikasi kode output dan menetapkan bahwa ketika string ditemukan, 0
(Sukses) dikembalikan, sedangkan 1
(kegagalan) dikembalikan saat string tidak ditemukan. jika
dapat menggunakan dua kode keluar ini untuk menjalankan baik Kemudian
atau kalau tidak
klausa yang ditentukan untuk itu.
Singkatnya, kita bisa menggunakan Jika grep -q
untuk menguji keberadaan string tertentu dalam file teks. Sintaks yang sepenuhnya benar, seperti yang terlihat sebelumnya dalam artikel ini, adalah Jika grep - -Binary -Files = Text -Qi "Search_term" Your_File.SQL
untuk pencarian case-non-sensitif, dan Jika grep - -Binary -Files = Text -Q "Search_term" your_file.SQL
untuk pencarian yang sensitif terhadap kasus.
Kesimpulan
Dalam artikel ini, kami melihat banyak alasan mengapa penting untuk digunakan --file biner = teks
di hampir semua pencarian grep. Kami juga mengeksplorasi menggunakan grep -q
dalam kombinasi dengan jika
pernyataan untuk menguji keberadaan string yang diberikan dalam file teks. Nikmati menggunakan grep
, dan tinggalkan kami komentar dengan yang terbaik grep
penemuan!
Tutorial Linux Terkait:
- Hal -hal yang harus diinstal pada ubuntu 20.04
- Menangani input pengguna dalam skrip bash
- Menguasai loop skrip bash
- Cara menemukan string atau teks dalam file di linux
- Gunakan WPSCan untuk memindai WordPress untuk kerentanan di Kali
- Mint 20: Lebih baik dari Ubuntu dan Microsoft Windows?
- Cara mengambil informasi perangkat keras dengan dmIdecode di linux
- Loop bersarang dalam skrip bash
- Pengantar Otomatisasi Linux, Alat dan Teknik
- Hal -hal yang harus dilakukan setelah menginstal ubuntu 20.04 FOSSA FOSSA Linux