2014-02-07 2 views
0

Я пытаюсь создать скрипт, который будет смотреть несколько журналов. У меня есть журнал запросов с каждым запросом отформатирован что-то вроде этого,Буферные записи в GNU awk

--- 
id=273482 
Result=Error 
--- 
id=342345 
Result=Success 
--- 

И второй журнал, где каждая строка имеет идентификатор запроса. Мне нужно следить за журналом запроса и перекрестно ссылаться на него со вторым журналом.

tail -f requestLog | awk \"BEGIN { RS = \"---\" } /Error/\" | grep --line-buffered id | sed -u ... 

I хвост -f в requestLog, использование AWK для разделения записей на "---", а затем Grep из строки идентификаторов. Затем я передаю все это sed -u, чтобы извлечь id и xargs, чтобы пойти grep второй журнал для строк, связанных с плохими запросами.

Проблема заключается в том, что результаты очень сильно задерживаются, потому что что-то (я думаю, awk) ошибочно буферизуется. Как я могу заставить awk читать входные данные без остановки и вымывать вывод каждый раз, когда он видит плохую запись? Кстати, я использую GNU awk.

ответ

2

GNU AWK имеет fflush() вы можете использовать для очистки буферов:

.. | awk 'BEGIN { RS = "---" } /Error/ { print; fflush(); }' | .. 

С этим вы линией буферной всех этапов в трубопроводе.

Если в будущем какие-либо другие программы в трубопроводе, которые не поддерживают что-то вроде AWK fflush, grep --line-buffered или sed -u, GNU Coreutils имеет более общий stdbuf можно использовать с любой программой:

.. | stdbuf -o 0 any_other_command | .. 
0

Вот исправление

tail -f requestLog|awk 'BEGIN{RS="--*"}/Error/{split($1,a,"=");print a[2]}' 
Смежные вопросы