Cara dengan benar GREP untuk teks dalam skrip bash

Cara dengan benar GREP untuk teks dalam skrip bash

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
Cara dengan benar GREP untuk teks dalam skrip bash

Persyaratan dan konvensi perangkat lunak yang digunakan

Persyaratan Perangkat Lunak dan Konvensi Baris Perintah Linux
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