В настоящее время у меня есть 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
¹ Большинство файловых систем позволяют блокам, которые полностью состоят из нулевых байтов, оставаться нераспределенными. Этот специализированный метод сжатия называется созданиемразреженный файл.