Подтвердить что ты не робот

Как вы подключаете вход через 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", результатом является то, что он зависает, как будто он ждет ввода (в случае, если вам интересно).

4b9b3361

Ответ 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 символа.

Вы также ищете различные шаблоны в своих двух примерах, если это необходимо.