`tail -f` частично использует последнюю строку, не обращает внимания на символы новой строки или nul

Используя awk и целочисленную математику:

awk 'NR%3 == 1 { print } NR%3 == 2 { delay=$0 } NR%3 == 0 { print; print delay; delay=""} END { if(length(delay) != 0 ) { print delay } }' /path/to/input

Оператор модуля выполняет целочисленное деление и возвращает остаток, поэтому для каждой строки он возвращает последовательность 1, 2, 0, 1, 2, 0. [...]. Зная это, мы просто сохраняем ввод в строках, где модуль равен 2, на потом — то есть сразу после печати ввода, когда он равен нулю.

0
23.03.2017, 22:41
1 ответ

коротко: не напрямую

долго: он не переносится (не в POSIX ), но если вы ограничиваете свой интерес к Linux, вы можете перенаправить вывод из ] tail -f через то, что является строчной буферизацией. Например, как предложено в unix command 'tail' lost option '--line-buffered' , GNU grep имеет параметр - line-buffered , позволяющий сделать это

tail -f "$bg_file" | grep --line-buffered -E '^.*$'

Однако, как указано в руководстве

- строчная буферизация
Использовать строчную буферизацию , это может снизить производительность .

( FreeBSD имеет те же параметры и комментарии из OpenBSD в 2004 году , но не POSIX , пока ...).

В документации на это не указывается, но первоначальная фиксация в 2001 году учитывала время, потраченное на выполнение fflush .

4
28.01.2020, 02:19

Теги

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