При выполнении tail -f error.log
, как программно вставить разрыв строки после того, как ничего не было добавлено в файл в течение 3 секунд?
(очевидно, как только один разрыв строки был добавлен, никакой другой разрыв строки не должен быть добавлен, пока другие строки текста не будут добавлены в файл журнала)
Например, эти строки добавляются в error.log:
foo
bar
boo [[wait 4 seconds]]
2far
2foo
2bar
2boo [[wait 40 seconds]]
2far
Это будет вывод в консоли:
foo
bar
boo
2far
2foo
2bar
2boo
2far
shell-script
text-processing
tail
Седрик
источник
источник
ts
чтобы добавить временную метку к выходу и обработать временные меткиОтветы:
Вы всегда можете реализовать
tail -f
(хорошо здесь, если вы не раскомментируетеseek()
, скорееtail -n +1 -f
как мы выкидываем весь файл) вручную,perl
например:Или позвольте
tail -f
сделать хвост и использоватьperl
для вставки новых строк, если нет ввода в течение 3 секунд:Они предполагают, что сам вывод не замедляется (например, когда вывод идет в канал, который активно не читается).
источник
bash
+date
решение:источник
$SECONDS
для подсчета временных интервалов. Я думаю, это количество секунд с момента запуска оболочки, а не то, что это имеет значение, если брать разницу.read -t
или$TMOUT
.$SECONDS
сломан вbash
аmksh
.time bash -c 'while ((SECONDS < 3)); do :; done'
будет длиться от 2 до 3 секунд. Лучше использовать вместо этого zsh или ksh93 здесь (сtypeset -F SECONDS
)date +%s
. Оба дают время в полных секундах, что приводит к тому, что интервал от, скажем, 1,9 до 4,0 выглядит как 3 полных секунды, хотя на самом деле он равен 2,1. Трудно обойти это, если все, что вы не можете получить доступ к доли секунды. Но да, они, вероятно, должны спать здесь вместо занятой, а затемread -t
могли бы также использоваться. Даже если вы спите вручную, всеtime bash -c 'while [[ $SECONDS -lt 3 ]]; do sleep 1; done'
работает отлично.SECONDS=0
гарантирует, что$SECONDS
будет достигать 1 ровно за 1 секунду. Это не тот случай,bash
когда он используетсяtime()
для отслеживания$SECONDS
вместоgettimeofday()
. Некоторое время назад я сообщал об ошибках в mksh, zsh и bash, только zsh был исправлен. (Хороший вопрос о том, что проблема та же самая сdate +%s
). Обратите внимание, что это не занятый цикл, так как мы читаем с выхода по каналуtail -f
.printf
эмулироватьdate
без внешних инструментов или подстановки команд:printf -v t '%(%s)T' -1
.Python
решение (с динамическим аргументом промежутка времени ):tailing_by_time.py
сценарий:Использование:
источник