Как найти специальный символ NUL (^ @ ^ @ ^ @)

26

Файл:

O000000667520994000000074720121112000000N^@^@^@ 

Я использовал приведенную ниже команду, но она не работает.

grep "^@^@^@" *

источник

Ответы:

52

Вы можете использовать grep для любых символов, включая управляющие / непечатаемые символы в режиме perl-regexp (-P), с помощью его шестнадцатеричного кода:

grep -Pa '\x00' ...
гость
источник
5
Возможно, вы захотите добавить -aопцию, иначе grepподумаете, что это двоичные данные и не будут отображать совпадающие строки.
mpy
Я не могу найти способ проверить, содержит ли файл только ASCII = 0 байт ... grep -Pv '\x00' fileне работает в Cygwin ...
pbies
@mpy Без -a(иногда?) это даже не находит образец. Благодарность! Может помочь @pbies.
Мишель де Рюйтер
13

^@это не карат ^и знак @, это один символ. Вот как некоторые программы отображают символ NUL - значение ASCII 0, также известное как \0C.

Здесь я создал файл с байтом NUL. Обратите внимание, что я использую, cat -vчтобы показать непечатные символы.

$ 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 не может найти NUL, так как они используются для завершения строк в C. Однако Sed может выполнить эту работу:

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

В vi в режиме вставки нажмите Ctrl- V, Ctrl- Shift- @чтобы вставить нулевой байт.

Джон Кугельман поддерживает Монику
источник
3

Если grep -Pне работает (например, в OS X), попробуйте это:

grep -E '\x00' ...
robinst
источник
Вы уверены, что это работает? Я не с моей версией: grep (GNU grep) 2.14
guettli
3
Этот ответ для grep BSD, попробуйте верхний ответ для grep GNU:grep -Pa '\x00' ...
robinst
1

В bash вы можете добавлять специальные символы с префиксом C-qили C-v. Так вы можете, например

grep 'Ctrl-vCtrl-a' file.txt

Строка поиска должна читаться как control key+ character v, а затем control key+ character a, что ищет значение ASCII SOH (01). К сожалению, это не работает для персонажа NUL.

Олаф Дитче
источник
Предположительно, вы на самом деле не имеете в виду, что такая последовательность символов должна быть записана буквально, а вместо этого вводиться логически на клавиатуре?
Легкость гонок с Моникой
Да, конечно. Удерживайте нажатой клавишу управления, нажмите v, затем, удерживая клавишу управления, нажмите a.
Олаф Дитче
Я думаю, что это неясно в вашем ответе.
Легкость гонок с Моникой
@LightnessRacesinOrbit Спасибо за подсказку. Я попытался уточнить в ответ.
Олаф Дитче
@JohnKugelman Спасибо за редактирование. Кажется, мне следовало присмотреться к помощи более внимательно.
Олаф Дитче
-3

Символ ^ @ - это NUL-символ, поэтому я боюсь, что он не может быть обработан напрямую.

Ваш лучший вариант, вероятно, будет написать простую программу, которая ищет эту последовательность байтов.

В качестве альтернативы вы можете попытаться преобразовать его в какой - либо форме шестнадцатеричного дампа ( od, xxdили так) и Grep на выход этого. Но, честно говоря, было бы сложно понять это правильно.

Rodrigo
источник