Bagaimana cara grep untuk karakter khusus NUL (^ @ ^ @ ^ @)

26

Mengajukan:

O000000667520994000000074720121112000000N^@^@^@ 

Saya menggunakan perintah di bawah ini tetapi tidak berhasil.

grep "^@^@^@" *

sumber

Jawaban:

52

Anda dapat memahami karakter apa pun termasuk karakter kontrol / tidak dapat dicetak dalam mode perl-regexp (-P) dengan kode hex-nya:

grep -Pa '\x00' ...
Tamu
sumber
5
Anda mungkin ingin menambahkan -aopsi, jika grepdianggap itu adalah data biner dan tidak akan menampilkan garis yang cocok.
mpy
Saya tidak dapat menemukan cara untuk memeriksa apakah file hanya mengandung ASCII = 0 byte ... grep -Pv '\x00' filetidak berfungsi di Cygwin ...
pbies
@ mpy Tanpa -a(kadang-kadang?) bahkan tidak menemukan polanya. Terima kasih! Mungkin bisa membantu @pai juga.
Michel de Ruiter
13

^@bukan karat ^dan tanda @, itu satu karakter. Begitulah cara beberapa program menampilkan karakter NUL — nilai ASCII 0, juga dikenal sebagai \0dalam C.

Di sini saya telah membuat file dengan byte NUL di dalamnya. Perhatikan bahwa saya menggunakan cat -vuntuk menunjukkan karakter yang tidak dicetak.

$ cat -v blah
hello
null^@
hi
$ hexdump -C blah
00000000  68 65 6c 6c 6f 0a 6e 75  6c 6c 00 0a 68 69 0a     |hello.null..hi.|
0000000f

Grep kesulitan menemukan NUL karena mereka digunakan untuk mengakhiri string dalam C. Sed, bagaimanapun, dapat melakukan pekerjaan:

$ sed -n '/\x0/p' blah
null
$ sed -n '/\x0/p' blah | cat -v
null^@

In vi, dalam mode insert tekan Ctrl- V, Ctrl- Shift- @untuk memasukkan byte nol.

John Kugelman mendukung Monica
sumber
3

Jika grep -Ptidak berfungsi (mis. Pada OS X), coba ini:

grep -E '\x00' ...
robinst
sumber
Apakah Anda yakin ini berhasil? Saya tidak menggunakan versi saya: grep (GNU grep) 2.14
guettli
3
Jawaban ini untuk BSD grep, coba jawaban atas untuk GNU grep:grep -Pa '\x00' ...
robinst
1

Dalam bash Anda dapat menambahkan karakter khusus ketika diawali dengan C-qatau C-v. Jadi Anda bisa, misalnya

grep 'Ctrl-vCtrl-a' file.txt

String pencarian harus dibaca sebagai control key+ character v, diikuti oleh control key+ character a, yang mencari nilai ASCII, SOH (01). Sayangnya ini tidak bekerja untuk karakter NUL.

Olaf Dietsche
sumber
Mungkin Anda tidak benar-benar bermaksud bahwa urutan karakter seperti itu harus dituliskan secara harfiah, tetapi dimasukkan pada keyboard secara logis?
Lightness Races with Monica
Ya tentu saja. Ini adalah tombol kontrol yang ditekan, tekan v, lalu tahan tombol Kontrol, tekan a.
Olaf Dietsche
Saya pikir itu tidak jelas dalam jawaban Anda.
Lightness Races with Monica
@LightnessRacesinOrbit Terima kasih atas petunjuknya. Saya mencoba mengklarifikasi jawabannya.
Olaf Dietsche
@JohnKugelman Terima kasih atas hasil editnya. Sepertinya saya harus mencari bantuan lebih dekat.
Olaf Dietsche
-3

Karakter ^ @ adalah karakter NUL, jadi saya khawatir karakter itu tidak dapat dipahami secara langsung.

Pilihan terbaik Anda mungkin menulis program sederhana yang mencari urutan byte ini.

Atau Anda dapat mencoba mengubahnya menjadi beberapa bentuk heksadesimal dump ( od, xxdatau lebih) dan grep ke outputnya. Tapi terus terang, akan sulit untuk memperbaikinya.

rodrigo
sumber