21

Файл:

O000000667520994000000074720121112000000N^@^@^@ 

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

grep "^@^@^@" *

6 ответов6

42

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

grep -Pa '\x00' ...
11

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

Здесь я создал файл с байтом 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 - @, чтобы вставить нулевой байт.

2

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

grep -E '\x00' ...
1

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

grep 'Ctrl-vCtrl-a' file.txt

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

-1

^ @ - это символ NUL. Что вы хотите сделать со строками ваших файлов, содержащих его?

Вы можете взглянуть на https://stackoverflow.com/questions/2398393/identifying-and-removing-null-characters-in-unix, где рассматривается аналогичная проблема.

-2

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .