grep kembali
File biner test.log cocok
Sebagai contoh
echo "line1 re \x00\r\nline2\r\nline3 re\r\n" > test.log # in zsh
echo -e "line1 re \x00\r\nline2\r\nline3 re\r\n" > test.log # in bash
grep re test.log
Saya berharap hasilnya akan menunjukkan baris1 dan baris3 (total dua baris).
Apakah mungkin menggunakan tr
konversi data yang tidak dapat dicetak menjadi data yang dapat dibaca, agar grep berfungsi kembali?
-e
dalamecho
perintah?Jawaban:
Anda dapat menjalankan file data melalui
cat -v
, misalnyayang kemudian bisa diproses lebih lanjut untuk membuang sampah; ini paling mirip dengan kueri Anda tentang penggunaan
tr
untuk tugas.sumber
man cat
dikatakan tentang-v
:-v, --show-nonprinting
use ^ and M- notation, except for LFD and TAB
set | cat -v | grep variable
grep --text
tidak selalu berhasil; itu menghormati CTRL + D sebagai terminator file. Jadi jika Anda memilikinya di file biner Anda, grep akan keluar lebih awal.Tidak bisa lebih sederhana dari itu.
sumber
grep --text
yang disebutkan paxdiablo 2 tahun sebelumnyaLC_ALL="C" grep -a
Salah satu caranya adalah dengan memperlakukan file biner sebagai teks saja,
grep --text
tetapi ini dapat mengakibatkan informasi biner dikirim ke terminal Anda. Itu bukan ide yang bagus jika Anda menjalankan terminal yang menafsirkan aliran keluaran (seperti VT / DEC atau banyak lainnya).Atau, Anda dapat mengirim file Anda melalui
tr
perintah berikut:Ini akan mengubah apa pun yang kurang dari karakter spasi (kecuali baris baru) dan apa pun yang lebih besar dari 126, menjadi a
.
karakter, hanya menyisakan barang cetakan.Jika Anda ingin setiap karakter "ilegal" diganti dengan yang berbeda, Anda dapat menggunakan sesuatu seperti program C berikut, filter input standar klasik:
Ini akan memberimu
{{NN}}
, di manaNN
kode hex untuk karakter tersebut. Anda cukup menyesuaikan fileprintf
untuk gaya keluaran apa pun yang Anda inginkan.Anda dapat melihat program itu beraksi di sini, di mana:
sumber
tr '[:cntrl:] '.'
lebih baik. Dan itu harus ada\000-\010\013\014\016-\037\177-\377'
dalam sintaks tr Anda.tr '[\000-\010\013\014\016-\037\177-\377]' '_'
bisa diterapkan, cntrl tidak cocok untuk kasus saya.cat
langkah dengan menyalurkangrep --text
ketr
alih-alih sebaliknya. Ini juga memungkinkan Anda menggrep beberapa file dan menyimpan referensi nama file dalam output.Anda dapat menggunakan "string" untuk mengekstrak string dari file biner, misalnya
sumber
Anda dapat memaksa grep untuk melihat file biner dengan:
Anda mungkin juga ingin menambahkan
-o
(--only-matching
) sehingga Anda tidak mendapatkan banyak omong kosong biner yang akan mengganggu terminal Anda.sumber
--only-matching
, dan regex Anda tidak cocok dengan data biner arbitrer, Anda tidak akan mendapat masalah.Dimulai dengan Grep 2.21, file biner diperlakukan secara berbeda :
Jadi yang terjadi sekarang adalah dengan data biner, semua byte non-teks (termasuk baris baru) diperlakukan sebagai terminator baris. Jika Anda ingin mengubah perilaku ini, Anda dapat:
gunakan
--text
. Ini akan memastikan bahwa hanya baris baru yang merupakan terminator barisgunakan
--null-data
. Ini akan memastikan bahwa hanya null byte yang merupakan terminator barissumber
grep -a akan memaksa grep untuk mencari dan mengeluarkan dari file yang menurut grep adalah biner. grep -a re test.log
sumber
Seperti yang sudah dikatakan James Selvakumar,
grep -a
lakukan triknya. -a atau --text memaksa Grep untuk menangani inputstream sebagai teks. Lihat Manpage http://unixhelp.ed.ac.uk/CGI/man-cgi?grepmencoba
sumber
Anda dapat melakukan
ini akan mengubah keluaran give sebagai string yang dapat dibaca ke grep.
sumber
Anda juga dapat mencoba alat Word Extractor . Word Extractor dapat digunakan dengan file apa pun di komputer Anda untuk memisahkan string yang berisi teks / kata manusia dari kode biner (aplikasi exe, DLL).
sumber
Inilah yang saya gunakan dalam sistem yang tidak menginstal perintah "string"
Ini mencetak teks dan menghapus karakter yang tidak dapat dicetak dalam satu gerakan, tidak seperti "cat -v nama file" yang memerlukan beberapa proses pasca untuk menghapus hal-hal yang tidak diinginkan. Perhatikan bahwa beberapa data biner mungkin dapat dicetak sehingga Anda masih akan mendapatkan beberapa omong kosong di antara hal-hal yang bagus. Saya pikir string juga menghilangkan omong kosong ini jika Anda bisa menggunakannya.
sumber