Я еще не разобрался, как сделать это без временного файла, но вот скрипт, который демонстрирует функционал grep
-фильтрованный less +F
(который очищает его временный файл). Я называю это lessf
.
Одним из ключевых элементов является аргумент --line-buffered
для grep
, который позволяет выводу tail
продолжать течь по конвейеру (команда unbuffer
, предоставляемая expect
, предоставляет аналогичные функции для любой программы).
#!/bin/sh
LOGFILE=$1
shift
PATTERN=$@
TEMP_DIR=/tmp/lesstmp
TEMP_FILE="$TEMP_DIR/$(basename $LOGFILE)"
[ ! -d $TEMP_DIR ] && mkdir $TEMP_DIR
trap 'rm -rf "$TEMP_DIR"; exit' INT TERM EXIT
( tail -f "$LOGFILE" | grep --line-buffered $PATTERN ) > "$TEMP_FILE" | less +F "$TEMP_FILE"
trap - INT TERM EXIT
Пример использования:
lessf /var/log/system.log foobar
lessf /var/log/system.log -v nobar