Как вы передаете ввод через grep другой утилите? - PullRequest
26 голосов
/ 10 июня 2009

Я использую tail -f, чтобы следить за файлом журнала, когда он обновляется; затем я передаю вывод этого в grep, чтобы показать только строки, содержащие поисковый запрос (в данном случае «org.springframework»); наконец, я хотел бы сделать так, чтобы вывод команды grep передавался третьей команде 'cut':

tail -f logfile | grep org.springframework | cut -c 25-

Команда cut удаляет для меня первые 25 символов каждой строки , если она может получить входные данные от grep! (работает, как и ожидалось, если я исключу 'grep' из цепочки.)

Я использую Cygwin с Bash.

Фактические результаты: Когда я добавляю второй канал для подключения к команде 'cut', в результате он зависает, как будто он ожидает ввода (на случай, если вам интересно).

Ответы [ 3 ]

29 голосов
/ 11 июня 2009

Предполагая GNU grep, добавьте --line-buffered в вашу командную строку, например.

tail -f logfile | grep --line-buffered org.springframework | cut -c 25-

Edit:

Я вижу, что буферизация grep здесь не единственная проблема, так как cut не разрешает буферизацию аналогичным образом.

вы можете попробовать заменить его на то, что вы можете контролировать, например 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("")}'
10 голосов
/ 11 июня 2009

В моей системе около 8K было буферизовано, прежде чем я получил какой-либо вывод Эта последовательность работала, чтобы немедленно следовать за файлом:

tail -f logfile | while read line ; do echo "$line"| grep 'org.springframework'|cut -c 25- ; done
0 голосов
/ 10 июня 2009

То, что у вас должно работать нормально - вот и вся идея конвейеров. Единственная проблема, которую я вижу, состоит в том, что в версии cut у меня (GNU coreutiles 6.10) вы должны использовать синтаксис cut -c 25- (т.е. использовать знак минус вместо знака плюс), чтобы удалить первые 24 символа.

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

...