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


26

Mengajukan:

O000000667520994000000074720121112000000N^@^@^@ 

Saya menggunakan perintah di bawah ini tetapi tidak berhasil.

grep "^@^@^@" *
linux  unix 

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' ...

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.


3

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

grep -E '\x00' ...

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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.