Файл:
O000000667520994000000074720121112000000N^@^@^@
Я использовал приведенную ниже команду, но она не работает.
grep "^@^@^@" *
Вы можете использовать grep для любых символов, включая управляющие / непечатаемые символы в режиме perl-regexp (-P), с помощью шестнадцатеричного кода:
grep -Pa '\x00' ...
^@
- это не карат ^
и знак @
, это один символ. Вот как некоторые программы отображают символ 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 - @, чтобы вставить нулевой байт.
Если grep -P
не работает (например, в OS X), попробуйте это:
grep -E '\x00' ...
В bash вы можете добавлять специальные символы, используя префикс C-q
или C-v
. Так вы можете, например
grep 'Ctrl-vCtrl-a' file.txt
Строка поиска должна читаться как control key
+ character v
, за которым следует control key
+ character a
, который ищет значение ASCII SOH (01). К сожалению, это не работает для персонажа NUL.
^ @ - это символ NUL. Что вы хотите сделать со строками ваших файлов, содержащих его?
Вы можете взглянуть на https://stackoverflow.com/questions/2398393/identifying-and-removing-null-characters-in-unix, где рассматривается аналогичная проблема.
Символ ^ @ - это NUL-символ, поэтому я боюсь, что он не может быть обработан напрямую.
Ваш лучший вариант, вероятно, будет написать простую программу, которая ищет эту последовательность байтов.
В качестве альтернативы вы можете попытаться преобразовать его в некую форму шестнадцатеричного дампа (od
, xxd
или около того) и добавить в вывод grep. Но, честно говоря, было бы сложно понять это правильно.