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

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

В настоящее время у меня есть netcatконвейер вывода, teeкоторый записывает в output.txt с помощью

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

Я хочу отслеживать этот вывод, поэтому я просматриваю его через tail -f | egrep -i 'regex'PuTTY, чтобы видеть только важные фрагменты.

Время от времени мне хочется очистить выходной файл. Проблема возникает, если я это делаю, > output.txtа затем снова пытаюсь, то tail -f | egrep ...не получаю выходных данных. Если я grep прохожу по файлу, я не получаю совпадений, хотя знаю, что естьдолженбыть совпадениями (так как cat output.txtвыдает файл правильно)

mitch@quartz:~$ grep output.txt -e 'regex'
Binary file output.txt matches

В то время как та же команда в output.txtдоопорожнение работает нормально.

В основном: >заставляет grepдумать, что мой файл — это двоичный файл, и он не будет правильно искать. Есть ли лучший способ очистить файл?

решение1

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

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

От man grep:

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

решение2

Возможно, это ответ на ваш вопрос. Вот результаты нескольких тестов, которые я только что провел:

$ > 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

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

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

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

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

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

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

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

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

Связанный контент