Освободите файл без grep, впоследствии рассматривающего его как двоичный файл

Односторонняя дорога:

sed -e :a -e 's/^.\{1,29\}$/&0/;ta' -e n file

Соответствуйте любому символу (.) и соответствуйте 1 - 29 символам того же типа (1,29). Если успешное соответствие, помещенное '0' позади подобранного шаблона (&). Когда сбои соответствия, что означает, когда количество символов, исключая первый символ превышает 29, остановите его, и следовательно мы получаем строковый нуль, дополненный 30.

n в конце просто читает следующую строку и печатает его. Таким образом, четные строки печатаются нетронутые.

Выполнение вышеупомянутого сценария:

$ sed -e :a -e 's/^.\{1,29\}$/&0/;ta' -e n file
FSDFDSFSD000000000000000000000
FDSFD
FHGDHFDHGHFGHGHGF0000000000000
HHGDF
GFDGDFGFDG00000000000000000000
GFDGFDGFDGDFGDGD
6
15.10.2014, 18:30
3 ответа

Если только проблема в том, что GREP лечит его как двоичный, скажите GREP , чтобы найти его независимо от:

$ head /bin/bash > out
$ echo "test" >> out 
$ grep test out 
Binary file out matches
$ grep -a test out 
test

из MAN GREEP :

   -a, --text
          Process  a binary file as if it were text; this is equivalent to
          the --binary-files=text option.
5
27.01.2020, 20:23

Это может ответить на ваш вопрос, поэтому вот результаты нескольких Тесты, которые я просто бегал:

$ > output.txt
$ file output.txt
output.txt: empty

$ echo "" > output.txt
$ file output.txt
output.txt: very short file (no magic)

$ echo " " > output.txt
$ file output.txt
output.txt : ASCII text

Как вы можете видеть, файл не классифицирован так же, как вы на самом деле «поставить » в нем, когда вы пытаетесь его очистить. Следовательно, вы можете использовать пустую строку, а не просто ничего.

3
27.01.2020, 20:23

>, что заставит grep думать, что файл является двоичным, потому что он является двоичным. Дело в том, что вы опустошили файл, но не остановили программу, которая его заполняла.

>output.txt создает output.txt, если он не существует, и усекает его до нулевой длины, если он существует.

В момент запуска >output.txt происходит процесс tee, в результате которого файл открыт. Усечение файла не влияет на позицию, на которой записывается tee. Допустим, перед усечением был записан N байт. В следующий раз, когда tee запишет после усечения, он начнёт запись с позиции N. Запись в позицию за текущим концом файла разрешена и заполняет начало файла нулевыми байтами.¹ Вот что здесь произошло.

Греп видит файл, который начинается с нескольких нулевых байт. Он корректно сообщает о файле как о двоичном файле.

Вы можете попросить GNU grep обращаться с файлом как с текстом, позвонив по телефону grep -a. Она будет искать весь файл, включая нулевые байты (которые не совпадают, поэтому они не влияют на результат, если только в первой строке нет совпадений, но они могут вызвать замедление, если их много).

Лучшим решением будет сказать tee, чтобы всегда запись производилась в текущем конце файла. К счастью (как заметил Стефан Чезелас), для этого есть возможность: tee -a (присутствует на всех POSIX-совместимых системах). Сначала нужно укоротить файл.

>output.txt
nc -l -k -p 9100 | tee -a output.txt

¹ Большинство файловых систем допускают, чтобы блоки, полностью состоящие из нулевых байтов, оставались нераспределенными. Этот специализированный метод сжатия называется созданием разреженного файла .

3
27.01.2020, 20:23

Теги

Похожие вопросы