Как вы подключаете вход через grep к другой утилите?
Я использую 'tail -f', чтобы следить за файлом журнала по мере его обновления; next Я передаю вывод этого в grep, чтобы отображать только строки, содержащие поисковый запрос ( "org.springframework" в этом случае); наконец, я хотел бы сделать, это вывод строки из grep в третью команду "cut":
tail -f logfile | grep org.springframework | cut -c 25-
Команда cut удалит первые 25 символов каждой строки для меня , если она может получить вход из grep! (работает, как и ожидалось, если я исключил "grep" из цепочки.)
Я использую cygwin с bash.
Фактические результаты: Когда я добавляю второй канал для подключения к команде "cut", результатом является то, что он зависает, как будто он ждет ввода (в случае, если вам интересно).
Ответы
Ответ 1
В моей системе примерно 8K буферизовалось до того, как я получил какой-либо вывод. Эта последовательность сработала, чтобы сразу следить за файлом:
tail -f logfile | while read line ; do echo "$line"| grep 'org.springframework'|cut -c 25- ; done
Ответ 2
Предполагая GNU grep, добавьте --line-buffered
в свою командную строку, например.
tail -f logfile | grep --line-buffered org.springframework | cut -c 25-
Edit:
Я вижу, что буферизация grep - не единственная проблема здесь, так как срез не позволяет буферизацию линии.
вы можете попробовать заменить его на что-то, что вы можете контролировать, например sed:
tail -f logfile | sed -u -n -e '/org\.springframework/ s/\(.\{0,25\}\).*$/\1/p'
или awk
tail -f logfile | awk '/org\.springframework/ {print substr($0, 0, 25);fflush("")}'
Ответ 3
То, что у вас должно работать, - вся идея трубопроводов. Единственная проблема, я вижу в том, что в версии cut
у меня есть (GNU coreutiles 6.10), вы должны использовать синтаксис cut -c 25-
(т.е. Использовать знак минуса вместо знака плюса), чтобы удалить первые 24 символа.
Вы также ищете различные шаблоны в своих двух примерах, если это необходимо.