Cara betul -betul mengasyikkan teks dalam skrip bash

Cara betul -betul mengasyikkan teks dalam skrip bash

grep adalah utiliti linux serba boleh, yang boleh mengambil masa beberapa tahun untuk menguasai dengan baik. Jurutera Linux yang berpengalaman mungkin membuat kesilapan dengan menganggap fail teks input yang diberikan akan mempunyai format tertentu. grep juga boleh digunakan, secara langsung digabungkan dengan jika carian berasaskan untuk mengimbas kehadiran rentetan dalam fail teks yang diberikan. Ketahui cara betul -betul grep untuk teks bebas daripada set watak, cara menggunakannya -q pilihan untuk teks untuk kehadiran rentetan, dan banyak lagi!

Dalam tutorial ini anda akan belajar:

  • Cara melakukan carian teks bebas aksara yang betul dengan grep
  • Cara Menggunakan Kenyataan GREP Lanjutan dari Dalam Skrip atau Perintah OneLiner Terminal
  • Cara menguji kehadiran rentetan menggunakan -q pilihan untuk grep
  • Contoh yang menonjolkan penggunaan grep untuk kes penggunaan ini
Cara betul -betul mengasyikkan teks dalam skrip bash

Keperluan perisian dan konvensyen yang digunakan

Keperluan Perisian dan Konvensyen Talian Perintah Linux
Kategori Keperluan, konvensyen atau versi perisian yang digunakan
Sistem Pengedaran linux-bebas
Perisian Baris perintah bash, sistem berasaskan linux
Yang lain Sebarang utiliti yang tidak termasuk dalam shell bash secara lalai boleh dipasang menggunakan sudo apt-get memasang nama utiliti (atau pemasangan yum untuk sistem berasaskan redhat)
Konvensyen # - memerlukan komando linux untuk dilaksanakan dengan keistimewaan akar sama ada secara langsung sebagai pengguna root atau dengan menggunakan sudo perintah
$-Memerlukan komando linux untuk dilaksanakan sebagai pengguna yang tidak istimewa

Contoh 1: Carian Teks Independent Watak yang betul dengan Grep

Apa yang berlaku apabila anda melepasi fail yang berasaskan teks/aksara, tetapi mengandungi aksara khas di luar julat normal? Ini berpotensi berlaku apabila fail mengandungi set aksara kompleks atau nampaknya mengandungi kandungan seperti binari. Untuk memahami perkara ini dengan lebih baik, kita perlu memahami data binari terlebih dahulu.

Kebanyakan (tetapi tidak semua) menggunakan komputer pada tahap paling asas mereka hanya dua negeri: 0 dan 1. Mungkin lebih mudah anda boleh memikirkan ini seperti suis: 0 tidak ada volt, tidak ada kuasa, dan 1 adalah "beberapa tahap voltan" atau berkuasa-on. Komputer moden dapat memproses berjuta -juta ini 0 dan 1 dalam sebahagian kecil. Ini adalah keadaan 0/1 dipanggil 'bit' dan merupakan sistem berangka asas-2 (sama seperti sistem perpuluhan 0-9 kami adalah sistem berangka asas-10). Terdapat cara lain untuk mewakili data berasaskan bit/binari seperti oktal (8-asas: 0-7) dan heksadesimal (16-asas: 0-f).

Kembali ke 'binari' (bin, dwi), anda boleh mula melihat bagaimana biasanya digunakan untuk menggambarkan apa-apa jenis data yang tidak dapat diiktiraf oleh manusia, tetapi dapat difahami oleh komputer berasaskan binari. Ini mungkin bukan analogi terbaik, seperti binari biasanya merujuk kepada dua negeri (benar/palsu), sedangkan yang sama dengan jargon 'data binari' telah datang ke data yang tidak mudah ditafsirkan dengan mudah.

Contohnya, fail kod sumber yang disusun dengan pengkompil mengandungi data binari kebanyakannya tidak boleh dibaca oleh manusia. Contohnya, fail kod sumber yang disusun dengan pengkompil mengandungi data binari kebanyakannya tidak boleh dibaca oleh mata manusia. Contoh lain boleh menjadi fail yang disulitkan atau fail konfigurasi yang ditulis dalam format yang sesuai.

Seperti apa ketika anda mencuba dan melihat data binari?

Biasanya, apabila melihat data binari untuk executable, anda akan melihat beberapa data binari yang sebenar (semua aksara mencari ganjil - komputer anda memaparkan data binari dalam keupayaan format output terhad yang disokong terminal anda), serta beberapa output berasaskan teks. Dalam kes ls Seperti yang dilihat di sini, mereka nampaknya berfungsi sebagai nama dalam ls kod.

Untuk melihat data binari dengan betul, anda benar -benar memerlukan penonton fail binari. Penonton sedemikian hanya memformat data dalam format asli mereka, bersama dengan lajur sampingan berasaskan teks. Ini mengelakkan batasan output teks dan membolehkan anda melihat kod komputer untuk apa yang sebenarnya adalah: 0 dan 1, walaupun sering diformat dalam pemformatan heksadesimal (0-F atau 0-F seperti yang ditunjukkan di bawah).

Mari kita lihat dua set 4 baris kod binari ls untuk melihat bagaimana rupa ini:

$ hexdump -c /bin /ls | kepala -n4; echo '...'; hexdump -c /bin /ls | Tail -N131 | HEAD -N4 00000000 7F 45 4C 46 02 01 01 00 00 00 00 00 00 00 00 00 |.Elf ... | 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 |.Versi ... GNU.V | 00022310 65 72 73 69 6f 6e 5f 72 00 2e 72 65 6c 61 2e 64 | eter… Rela.D | 00022320 79 6e 00 2e 72 65 6c 61 2e 70 6c 74 00 2e 69 6e | yn ... rela.plt ... dalam | 00022330 69 74 00 2e 70 6c 74 2e 67 6f 74 00 2e 70 6c 74 | Ia ... Plt.mendapat ... plt | 


Bagaimana semua ini (selain mempelajari lebih lanjut mengenai bagaimana komputer berfungsi) membantu anda memahami dengan betul grep penggunaan? Mari kembali kepada soalan asal kami: Apa yang berlaku apabila anda melepasi fail yang berasaskan teks/aksara, tetapi mengandungi watak khas di luar julat biasa?

Sekarang kita boleh menuliskan semula ini kepada 'Apa yang Berlaku Apabila Anda Melalui Fail Perduaan'? Reaksi pertama anda mungkin: Mengapa saya mahu mencari melalui fail binari?. Sebahagiannya, jawapannya menunjukkan di atas ls contoh sudah; Selalunya fail binari masih mengandungi rentetan berasaskan teks.

Dan ada sebab yang lebih penting dan utama; grep Secara lalai akan menganggap banyak fail untuk mengandungi data binari sebaik sahaja mereka mempunyai aksara khas di dalamnya, dan mungkin apabila mereka mengandungi urutan melarikan diri binari tertentu, walaupun fail itu sendiri mungkin berasaskan data. Apa yang lebih teruk ialah secara lalai Grep akan gagal dan membatalkan pengimbasan fail -fail ini sebaik sahaja data tersebut dijumpai:

$ kepala -n2 test_data.SQL Buat Jadual T1 (ID int); Masukkan ke dalam nilai T1 (1); $ grep 'sisipkan' test_data.SQL | Ekor -N2 masukkan ke dalam nilai T1 (1000); Fail binari test_data.Perlawanan SQL 

Sebagai dua contoh yang menonjol dari pengalaman peribadi dengan kerja pangkalan data, apabila anda mengimbas log ralat pelayan pangkalan data, yang dengan mudah boleh mengandungi aksara khas seperti pada masa -masa mesej ralat, pangkalan data, jadual dan nama medan boleh membuatnya ke log ralat dan mesej tersebut secara teratur dalam set watak khusus di rantau.

Contoh lain ialah ujian SQL yang diperoleh dari suite ujian pangkalan data (ditunjukkan dalam contoh di atas). Data sedemikian sering mengandungi aksara khas untuk menguji dan menekankan pelayan dengan banyak cara. Perkara yang sama akan digunakan untuk kebanyakan data ujian laman web dan set data ujian domain lain. Oleh kerana grep gagal secara lalai terhadap data tersebut, penting untuk memastikan kami menambah pilihan untuk Grep untuk menutupi ini.

Pilihannya ialah --File binari = teks. Kita dapat melihat bagaimana grep kita sekarang berfungsi dengan betul:

$ grep 'sisipkan' test_data.SQL | wc -l 7671 $ grep 'sisipkan' test_data.SQL | Ekor -n1 Fail binari Test_data.SQL Perlawanan $ grep--binary-files = text 'Insert' test_data.SQL | WC -L 690427 

Apa perbezaannya! Anda boleh bayangkan berapa banyak automatik grep skrip di seluruh dunia gagal mengimbas semua data yang harus mereka imbas. Apa yang lebih buruk, dan dengan ketara menggabungkan masalahnya ialah grep gagal 100% senyap apabila ini berlaku, kod ralat akan menjadi 0 (kejayaan) dalam kedua -dua kes:

$ grep -q 'sisipkan' test_data.SQL; echo $? 0 $ grep - -binary -files = text -q 'Insert' test_data.SQL; echo $? 0 


Lebih banyak lagi, mesej ralat dipaparkan pada stdout output, dan tidak dihidupkan stderr Seperti yang diharapkan. Kita dapat mengesahkannya dengan mengalihkan stderr ke peranti null /dev/null, hanya memaparkan stdout pengeluaran. Output kekal:

$ grep 'sisipkan' test_data.SQL 2>/DEV/NULL | Ekor -n1 Fail binari Test_data.Perlawanan SQL 

Ini juga bermaksud bahawa jika anda akan mengalihkan hasil grep anda ke fail lain (> SomeFile.txt selepas perintah grep), bahawa 'fail binari ... perlawanan' kini akan menjadi sebahagian daripada fail itu, selain kehilangan semua entri yang dilihat selepas masalah itu berlaku.

Isu lain adalah aspek keselamatan: Mari kita ambil organisasi yang mempunyai log masuk akses skrip ke laporan e -mel kepada sysadmins setiap kali ejen penyangak (seperti penggodam) cuba dan mengakses sumber yang tidak dibenarkan. Sekiranya penggodam sedemikian dapat memasukkan beberapa data binari ke dalam log akses sebelum percubaan akses mereka, dan grep tidak dilindungi oleh --File binari = teks, Tidak ada e -mel seperti yang akan dihantar.

Walaupun skrip itu dibangunkan cukup baik untuk memeriksa grep Kod keluar, masih tiada siapa yang akan melihat ralat skrip, apabila pulangan grep 0, atau dengan kata lain: Kejayaan. Kejayaan itu tidak walaupun 🙂

Terdapat dua penyelesaian mudah; Tambah --File binari = teks kepada semua anda grep pernyataan, dan anda mungkin ingin mempertimbangkan pengimbasan output grep (atau kandungan fail output yang diarahkan) untuk ekspresi biasa '^Fail Perduaan.*perlawanan '. Untuk maklumat lanjut mengenai ungkapan biasa, lihat Bash Regexps Untuk Pemula dengan Contoh dan Advanced Bash Regex dengan Contoh. Walau bagaimanapun, sama ada melakukan kedua-dua atau hanya yang pertama lebih disukai, kerana pilihan kedua bukan bukti masa depan; teks 'binari ... sepadan' mungkin berubah.

Akhirnya, perhatikan bahawa apabila fail teks menjadi rosak (kegagalan cakera, kegagalan rangkaian dan lain -lain.), kandungannya mungkin menjadi sebahagian-teks dan bahagian binari. Ini adalah satu lagi sebab untuk sentiasa melindungi anda grep pernyataan dengan --File binari = teks pilihan.

Tl; dr: Gunakan --File binari = teks untuk semua anda grep pernyataan, walaupun mereka kini bekerja dengan baik. Anda tidak pernah tahu bila data binari itu dapat memukul fail anda.

Contoh 2: Uji kehadiran rentetan yang diberikan dalam fail teks

Kita boleh guna grep -q dalam kombinasi dengan jika pernyataan untuk menguji kehadiran rentetan yang diberikan dalam fail teks:

$ jika grep -binary -files = text -qi "masukkan" test_data.SQL; kemudian echo "dijumpai!"; lain echo" tidak dijumpai!"; fi dijumpai! 

Mari kita pecahkan sedikit ini dengan memeriksa terlebih dahulu jika data benar -benar wujud:

$ grep -binary -files = text -i "masukkan" test_data.SQL | Kepala -n1 masukkan ke dalam nilai T1 (1); 

Di sini kami menjatuhkan q (tenang) pilihan untuk mendapatkan output dan melihat bahawa rentetan 'sisipan' - diambil dengan cara yang tidak sensitif (dengan menentukan -i pilihan untuk grep ada dalam fail sebagai 'masukkan ...'.

Perhatikan bahawa q pilihan tidak khusus a ujian pilihan. Ia adalah pengubah output yang diberitahu grep untuk 'tenang', saya.e. tidak mengeluarkan apa -apa. Jadi bagaimana jika pernyataan tahu sama ada terdapat kehadiran rentetan yang diberikan dalam fail teks? Ini dilakukan melalui grep Kod Keluar:

$ grep -binary -files = text -i "masukkan" test_data.sql 2> & 1>/dev/null; echo $? 0 $ grep - -binary -files = text -i "ini tidak ada" test_data.sql 2> & 1>/dev/null; echo $? 1 


Di sini kami melakukan pengalihan manual semua stderr dan sdtout output ke /dev/null dengan mengalihkan stderr (2>) hingga stdout (& 1) dan mengalihkan semua stdout output ke peranti null (>/dev/null). Ini pada dasarnya bersamaan dengan -q (tenang) pilihan untuk grep.

Kami seterusnya mengesahkan kod output dan menegaskan bahawa apabila rentetan dijumpai, 0 (kejayaan) dikembalikan, sedangkan 1 (kegagalan) dikembalikan apabila rentetan tidak dijumpai. jika boleh menggunakan kedua -dua kod keluar ini untuk melaksanakan sama ada kemudian atau lain klausa yang ditentukan kepadanya.

Ringkasnya, kita boleh menggunakan jika grep -q Untuk menguji kehadiran rentetan tertentu dalam fail teks. Sintaks yang betul, seperti yang dilihat sebelumnya dalam artikel ini, adalah jika grep -binary -files = text -qi "search_term" your_file.SQL untuk carian kes-tidak sensitif, dan jika grep -binary -files = text -q "search_term" your_file.SQL Untuk carian sensitif kes.

Kesimpulan

Dalam artikel ini, kita melihat banyak sebab mengapa penting untuk digunakan --File binari = teks Pada hampir semua carian Grep. Kami juga meneroka menggunakan grep -q Dalam kombinasi dengan jika penyataan untuk menguji kehadiran rentetan yang diberikan dalam fail teks. Nikmati menggunakan grep, dan tinggalkan kami komen dengan yang paling hebat grep penemuan!

Tutorial Linux Berkaitan:

  • Perkara yang hendak dipasang di Ubuntu 20.04
  • Mengendalikan input pengguna dalam skrip bash
  • Menguasai Gelung Skrip Bash
  • Cara mencari rentetan atau teks dalam fail di linux
  • Gunakan WPSCAN untuk mengimbas WordPress untuk kelemahan di Kali
  • Mint 20: Lebih baik daripada Ubuntu dan Microsoft Windows?
  • Cara Mendapatkan Maklumat Perkakasan dengan Dmidecode di Linux
  • Gelung bersarang dalam skrip bash
  • Pengenalan kepada Automasi, Alat dan Teknik Linux
  • Perkara yang perlu dilakukan setelah memasang ubuntu 20.04 Focal Fossa Linux