2015-03-05 3 views
2

Я используюНепрерывный Grep, выход на том же месте на консоли

tail -f file | grep pattern 

все время непрерывного Grep.

Однако, есть ли способ заставить grep выводить свой узор в том же месте, скажем, в верхней части экрана? так что экран не прокручивается все время?

В моем случае это примерно так: tail -f log_file | grep Status -A 2 покажет текущий статус и изменит его на этот статус. Проблема заключается в прокрутках экрана, и это становится раздражающим. Я предпочел бы, чтобы выход застрял в первых трех строках экрана.

Спасибо!

+4

Не совсем то же самое, но [смотреть] (http: //linux.die.net/man/1/watch) приходит в голову как инструмент, который выводит вывод в верхней части экрана. – legoscia

+0

Попробуйте запустить его через 'sed' и добавьте' \ r' в конец каждой строки. –

+0

@MarkSetchell Вам нужно будет очистить экран/линии, или вы получите стандартную сортировку артефактов. Но это интересная идея. –

ответ

2

Вы можете использовать команду watch; который всегда будет выполнять ту же команду, но позиция на экране останется неизменной. Процесс мог бы съесть еще больше процессора или памяти:

watch "tail file | grep pattern" 

по умолчанию часы исполняют эту команду каждые 2 секунды. Вы можете настроить до 0,1 секунд с помощью:

watch -n 0.1 

Примечание Как отметил @etanReisner: это не совсем так же, как tail -f: tail -f изменится сразу, если что-то добавляется в лог-файл, команда часы будет только замечать, что при выполнении, т.е. каждые 2 (или 0,1 секунды).

+1

Вам нужно будет процитировать этот хвостовой файл 'watch '| grep pattern'', чтобы заставить его работать, я думаю. В противном случае вы будете использовать выход часов, который, скорее всего, не нужен. –

+1

Также это не совсем то же самое, что 'tail -f' даже в' 0,1', если журнал заполняется очень быстро. –

+0

спасибо за два очень конструктивных комментария! Я знаю, что это не совсем то же самое, поэтому я добавил это замечание. –

1

Предполагая, что вы используете совместимый эмулятор vt100 ...

Эта команда будет хвост файл, труба его в grep, прочитать его строки в то время, а затем отобразить его в обратном направлении, на верхней строке экран:

TOSL=$(tput sc;tput cup 0 0;tput rev;tput el) 
FROMSL=$(tput sgr0; tput rc) 
tail -f file | grep --line-buffered pattern | while read line 
do 
    echo -n "$TOSL${line}$FROMSL" 
done 

Предполагается, что на вашем выходе появляется строка за раз. Если вы хотите больше одной строки, вы можете прочитать больше, чем строку, но вам нужно решить, как вы хотите буферировать вывод. Вы также можете использовать команду term term csr для настройки всей отдельной области прокрутки вместо одной строки.

Вот прокрутка версия области с областью состояния в десять линии в верхней части:

TOSL=$(tput sc; tput csr 0 10; tput cup 10 0;tput rev;tput el) 
FROMSL=$(tput sgr0; tput rc;tput csr 10 50;tput rc) 
tail -f file | grep --line-buffered pattern | while read line 
do 
     echo -n "$TOSL${line} 
$FROMSL" 
done 

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

1

Просто замените символы новой строки на возврат каретки.

tail -f file | grep --line-buffered whatever | tr '\012' '\015' 

Буферная линия должна избегать выхода из строя; см. http://mywiki.wooledge.org/BashFAQ/009

Это быстро и грязно. Как отмечено в комментариях, это оставит предыдущее содержимое строки внизу, поэтому более короткая строка не будет полностью перекрывать более длинную строку. Вы могли бы добавить некоторые управляющие коды для этого, но тогда вы могли бы также использовать Curses для форматирования, например, в rghome's answer.

Смежные вопросы