Я вряд ли верю этому, я мог бы написать ответ, включающий cat
!
Символы, которые вы наблюдаете, непечатные символы, которые часто пишутся в Carret нотации . Нотация карета для символа - это способ визуализации непечатных символов. Как упомянуто в OP, ^@
является представлением NULL
.
Если в вашем файле есть непечатаемые символы, вы можете визуализировать их, используя cat -vET
:
-E, --show-ends
: отображение $
в конце каждой строки
-T, --show-tabs
: отображение TAB
символов в виде ^I
-v, --show-nonprinting
: использовать обозначения ^
и M-
, за исключением LFD
и TAB
источник: man cat
Я добавил флаг -E
и -T
, чтобы конвертировать все, что нельзя распечатать.
Поскольку grep
не будет выводить непечатные символы самостоятельно в любой форме, вы должны направить их вывод в cat
, чтобы увидеть их. В следующем примере показаны все строки, содержащие непечатаемые символы
Показать все строки с непечатными символами:
$ grep -E '[^[:print:]]' --color=never file | cat -vET
Здесь ERE [^[:print:]]
выбирает все непечатаемые символы.
Показать все строки с NULL
:
$ grep -Pa '\x00' --color=never file | cat -vET
Имейте в виду, что здесь нам необходимо использовать регулярные выражения Perl, поскольку они понимают шестнадцатеричную и восьмеричную нотацию.
Различные символы управления могут быть написаны на языке C: \n
соответствует новой строке, \t
табуляция, \r
возврат каретки, \f
перевод формы и т. Д.
В более общем смысле, \nnn
, где nnn
- строка из трех восьмеричных цифр, соответствует символу, чья собственная кодовая точка равна nnn
. Вы можете легко столкнуться с проблемой, если у вас нет точно трех цифр. Поэтому всегда используйте три, или начиная с Perl 5.14, вы можете использовать \o{...}
для указания любого числа восьмеричных цифр.
Аналогично, \xnn
, где nn
- шестнадцатеричные цифры, соответствует символу, чей собственный порядковый номер равен nn
. Опять же, не использование ровно двух цифр - это путь к катастрофе, но вы можете использовать \x{...}
для указания любого количества шестнадцатеричных цифр.
источник: Perl 5 версия 26.1 документация
Пример:
$ printf 'foo\012\011\011bar\014\010\012foobar\012\011\000\013\000car\012\011\011\011\012' > test.txt
$ cat test.txt
foo
bar
foobar
car
Если мы теперь используем только grep
, мы получим следующее:
$ grep -Pa '\x00' --color=never test.txt
car
Но добавление к cat
позволяет нам визуализировать управляющие символы:
$ grep -Pa '\x00' --color=never test.txt | cat -vET
^I^@^K^@car$
Почему --color=never
: Если ваш grep настроен на --color=auto
или --color=always
, он добавит дополнительные управляющие символы, которые будут интерпретироваться как цвет для терминала. И это может сбить вас с толку содержанием.
$ grep -Pa '\x00' --color=always test.txt | cat -vET
^I^[[01;31m^[[K^@^[[m^[[K^K^[[01;31m^[[K^@^[[m^[[Kcar$