Функция фильтра для менее +F
При просмотре растущего файла журнала, например, "less -iS +F service.log", я хочу ограничить отображение строками, соответствующими определенному шаблону.
Я пробовал что-то вроде
less +F service.log | grep <pattern> | less +F
который не работает. Также
cat < service.log | grep <pattern> | less +F
не делаю то, что я хочу. Похоже, что вход уже закрыт и меньше не показывает изменений.
Как я могу ограничить отображение линиями, соответствующими определенному шаблону?
4 ответа
Этому вопросу давно, но я все же думаю, что стоит добавить решение. Вместо того, чтобы пытаться сначала использовать grep, а затем использовать меньше, как насчет использования фильтрации внутри less?
Вкратце:
use less +F
в вашем файлеCTRL-C
чтобы временно прервать "следующее" действие- Тип
&
и ваш шаблон для включения фильтрации - Проблема
+F
чтобы снова включить "следующее" действие
Подробнее об этом ответе на Unix&Linux StackExchange
Я еще не разобрался, как сделать это без временного файла, но вот скрипт, который демонстрирует функционал grep
-filtered 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
Если вы не возражаете, порождая и разбирая несколько процессов в каждой строке, используйте цикл read while
tail -f filename.log|while read line; do echo $line | grep pattern; done
Решение казалось простым
LESSOPEN='|grep <pattern> %s' less +F service.log
но less не продолжает читать новые строки из растущего файла журнала.