Я хотел бы контролировать мой /var/log/syslog
непрерывно. Однако при контроле, я хотел бы избежать определенного шаблона (шаблонов) при контроле. Я интересуюсь только последними 15 (например), строки.
Для обычного контроля я использую команду:
watch -n 1 tail -n 15 /var/log/syslog
Принимая во внимание, что, то, что я на самом деле хотел бы иметь, является чем-то как:
watch -n 1 tail -n 15 /var/log/syslog | grep -v -E 'pattern1|pattern2'
Будучи более конкретным с моим требованием:
Я хотел бы непрерывно контролировать записи в syslog
, предотвращение определенного шаблона (шаблонов). Экран должен быть обновлен каждый установленный срок (скажите 1 с или 2 с).
Следующее является более (неудавшимися) попытками:
watch cat /var/log/syslog | grep -v -E 'pattern1|pattern2'
(Частично) успешная попытка:
while true;
do
clear;
cat /var/log/syslog | grep -v -E 'pattern1|pattern2' | tail -15;
sleep 1;
echo '\"CTRL-C\" to close';
done
Однако гладкость watch
потерян здесь.
Сводка
Таким образом, вопрос, там любой способ объединиться watch
, tail
и grep
?
Я использую bash 4.4.7
на 17,04.
Проблема с Вашим watch -n 1 tail -n 15 /var/log/syslog | grep -v -E 'pattern1|pattern2'
, я думаю , то, что она выполняет tail -n 15 /var/log/syslog
внутренний watch
, затем передает результат по каналу к grep
. Это почти наверняка заставляет промежуточный вывод быть буферизованным таким способом, которым Вы не видите то, что Вы ожидаете (по крайней мере, не, когда Вы будете ожидать это).
существует, вероятно, способ достигнуть того, что Вы хотите с умным использованием stdbuf
и/или --line-buffered
grep опция, однако более простой путь состоит в том, чтобы выполнить целый конвейер в watch
:
watch -n 1 'tail -n 15 /var/log/syslog | grep -v -E "pattern1|pattern2"'