Функция фильтра для менее + F - PullRequest
5 голосов
/ 19 ноября 2009

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

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

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

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

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

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

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

Ответы [ 5 ]

3 голосов
/ 13 мая 2019

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

Вкратце:

  1. use less +F в вашем файле
  2. CTRL-C, чтобы временно прервать действие «следующий»
  3. Введите & и ваш шаблон для включения фильтрации
  4. Выполните команду +F для повторного включения «следующего» действия

Подробнее об этом ответе на Unix & Linux StackExchange

1 голос
/ 29 декабря 2011

Я еще не разобрался, как сделать это без временного файла, но вот скрипт, который демонстрирует функционал 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

1 голос
/ 11 августа 2011

Если вы не возражаете, порождая и прерывая несколько процессов в каждой строке, используйте цикл чтения пока

tail -f filename.log|while read line; do echo $line | grep pattern; done
0 голосов
/ 20 ноября 2009

Решение казалось простым

LESSOPEN='|grep <pattern> %s' less +F service.log

но less не продолжает читать новые строки из растущего файла журнала.

0 голосов
/ 19 ноября 2009
tail -f service.log | grep <pattern>
...