вырезать из потока для символа EOL / EOF

Мне нужно что-то вырезать из потока, но кажется, что вырезать не удается обработать последнюю строку до появления EOL или EOF.

Моя команда bash:

tail -n 5 -F /data/apache/log/error/error-log | cut -d ' ' -f1-5

файл журнала содержит, например:

[Wed Jan 14 09:00:00 2015] [error] Error 1
[Wed Jan 14 09:10:00 2015] [error] Error 2
[Wed Jan 14 09:20:00 2015] [error] Error 3
[Wed Jan 14 09:30:00 2015] [error] Error 4
[Wed Jan 14 09:40:00 2015] [error] Error 5

но мой результат:

[Wed Jan 14 09:00:00 2015]
[Wed Jan 14 09:10:00 2015]
[Wed Jan 14 09:20:00 2015]
[Wed Jan 14 09:30:00 2015]

Есть ли способ сделать процесс вырезания (и вывод) последней незавершенной строкой, если все необходимые столбцы (первые пять) уже переданы в потоковом режиме?

Мой желаемый результат должен содержать последнюю строку из потока:

[Wed Jan 14 09:00:00 2015]
[Wed Jan 14 09:10:00 2015]
[Wed Jan 14 09:20:00 2015]
[Wed Jan 14 09:30:00 2015]
[Wed Jan 14 09:40:00 2015]

// редактировать Ответы «remove -F» бесполезны, потому что они нужны мне для прямой трансляции. Всякий раз, когда apache добавляет новую запись в журнал, мне нужно немедленно обработать ее с помощью cut. Без взаимодействия с пользователем, без повторного запуска скрипта и т. Д. Просто обрабатывайте поток в реальном времени таким образом, чтобы этот «разрез» не ждал EOL, прежде чем он обработает (и выведет) строку. Если это невозможно, хорошо, я пытаюсь найти обходной путь, но, пожалуйста, не говорите мне не использовать прямую трансляцию, когда мне нужна прямая трансляция!


person Ján Stibila    schedule 14.01.2015    source источник
comment
вырезать по строкам, пока он не увидит EOF или EOL, он не начнет обрабатывать запись. а с указанием -F игнорирует EOF.   -  person Jasen    schedule 14.01.2015
comment
Так что нет возможности заставить обработать до EOL?   -  person Ján Stibila    schedule 14.01.2015
comment
у вас есть доступ к исходному коду, я полагаю :)   -  person Jasen    schedule 14.01.2015
comment
исходный код хвоста? здесь git.savannah.gnu.org/cgit/coreutils .git / tree / src / tail.c :) но я действительно не хочу переписывать и перекомпилировать утилиту ядра linux для одной простой функции в простом скрипте. На данный момент я сделал это по-другому и вместо обработки потока данных я вызываю tail + cut каждые 5 секунд для новых данных. Не такое чистое решение, но все же лучше, чем переписывание хвоста: D   -  person Ján Stibila    schedule 14.01.2015
comment
нет возможности принудительно обработать до EOL = ›Вам нужно еще раз подумать. Даже если у него есть способ обработать до EOL, скажем, с помощью настроенного сценария perl, вам необходимо предоставить шаблон конца строки, чтобы сценарий выполнял поиск, чтобы знать, когда доступна полная строка (без разрыва строки) для обработки. Вы же не хотите, чтобы ваша программа обрабатывалась на полпути, верно?   -  person Robin Hsu    schedule 14.01.2015
comment
Если вы каким-то образом скажете программе после обработки игнорировать что-либо до EOL ... но это слишком сложно для небольшого скрипта.   -  person Ján Stibila    schedule 14.01.2015


Ответы (2)


Наконец, после некоторых тестов я обнаружил, что проблема не в tail, а в cut. Замена cut на awk устраняет проблему:

tail -n 5 -F /data/apache/log/error/error-log | awk '{print $1, $2, $3, $4, $5}'
person Robin Hsu    schedule 15.01.2015
comment
нет необходимости говорить -F" ", так как это настройки по умолчанию. Кроме того, print $1" "$2" "... совпадает с print $1, $2, ..., потому что, когда вы ставите запятую, устанавливается разделитель поля вывода по умолчанию (OFS). - person fedorqui 'SO stop harming'; 15.01.2015
comment
@fedorqui: Спасибо за это. Я знал это давно. Однако я не так часто использовал awk и просто хочу ответить на этот вопрос быстро и правильно. Это резервирование для безопасности. ... :-) - person Robin Hsu; 16.01.2015
comment
Что ж, хотя всегда хорошо быть в безопасности, также хорошо избегать дублирования. Я сделал себе правку, не стесняйтесь отозвать, если вы считаете, что это снижает качество. Мне это кажется более правильным. - person fedorqui 'SO stop harming'; 16.01.2015

Действительно ли необходима опция -F (следовать и повторить)?
Удалите ее, и она заработает.

person Albert    schedule 14.01.2015
comment
Это необходимо. Как я уже сказал, он мне нужен для потока - журнала чтения в реальном времени. - person Ján Stibila; 14.01.2015
comment
Я не знаю, как tail реализован для вывода данных по мере роста файла, но, насколько мне известно, я боюсь, что вы не сможете сделать это с помощью tail. Представьте себе процесс, который читает этот файл каждые X секунд или минут, используя wait и sleep, или задачу cron. - person Albert; 14.01.2015