Функция фильтра для менее +F

При просмотре растущего файла журнала, например, "less -iS +F service.log", я хочу ограничить отображение строками, соответствующими определенному шаблону.

Я пробовал что-то вроде

less +F service.log | grep <pattern> | less +F

который не работает. Также

cat < service.log | grep <pattern> | less +F

не делаю то, что я хочу. Похоже, что вход уже закрыт и меньше не показывает изменений.

Как я могу ограничить отображение линиями, соответствующими определенному шаблону?

4 ответа

Этому вопросу давно, но я все же думаю, что стоит добавить решение. Вместо того, чтобы пытаться сначала использовать grep, а затем использовать меньше, как насчет использования фильтрации внутри less?

Вкратце:

  1. use less +F в вашем файле
  2. CTRL-C чтобы временно прервать "следующее" действие
  3. Тип & и ваш шаблон для включения фильтрации
  4. Проблема +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 не продолжает читать новые строки из растущего файла журнала.

tail -f service.log | grep <pattern>
Другие вопросы по тегам