Найти файлы с непечатными символами (нулевые байты) - PullRequest
0 голосов
/ 10 января 2019

Я получил журнал моего приложения с полем, содержащим странные символы. Я вижу эти символы только когда использую команду less.

Я пытался скопировать результат моей строки кода в текстовый файл, и я вижу

CTP_OUT=^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@

Я хотел бы знать, есть ли способ найти эти нулевые символы. Я попытался с помощью команды grep, но она ничего не показала

Ответы [ 2 ]

0 голосов
/ 11 января 2019

sed банка.

 sed -n '/\x0/ { s/\x0/<NUL>/g; p}' file

-n пропускает печать любого вывода, если явно не запрошено.
/\x0/ выбирает только строки с нулевыми байтами.
{...} инкапсулирует несколько команд, так что они могут применяться коллективно всегда и только тогда, когда /\x0/ обнаружил нулевое значение в строке.
s/\x0/<NUL>/g; заменяет новое видимое значение на нулевые байты. Вы можете сделать это как хотите - я использовал <NUL> как нечто достаточно очевидное, но вряд ли могло произойти иначе. Вам, вероятно, следует сначала выполнить поиск файла, чтобы убедиться, что шаблон не существует, прежде чем использовать его.
p; приводит к отображению строк, которые были отредактированы (потому что у них был нулевой байт).

Это в основном делает sed эффективным grep для нулей.

0 голосов
/ 10 января 2019

Я вряд ли верю этому, я мог бы написать ответ, включающий 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$
...