7

Я пытаюсь направить tail -f в awk для мониторинга файла журнала в режиме реального времени, но в соответствии с примерами проблем не должно быть, но я не могу заставить его работать.

вот команда, которую я выполняю

tail -f logfile.log | awk -F" " '{print $1, $2, $7, $8}'

Но когда я редактирую свой файл с помощью nano add line, он не печатается в реальном времени. Если я запускаю команду awk напрямую, моя новая строка появляется в результате.

3 ответа3

9

Вы не видите его в реальном времени, потому что для эффективности трубы буферизуются. tail -f должен заполнить буфер, обычно 4 кБ, перед тем как вывод передается в awk .

Исправление заключается в использовании команды unbuffer, которая является частью ожидаемого пакета:

unbuffer tail -f logfile.log | awk -F" " '{print $1, $2, $7, $8}'

Этот трюк tail задуматься, что он пишет в интерактивный терминал. В результате он не буферизируется.

Для получения дополнительной информации см. Https://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe.

В качестве альтернативы, если у вас GNU coreutils 7.5 или выше, вы можете отключить буферизацию вывода с помощью команды stdbuf:

stdbuf -o0 tail -f logfile.log | awk -F" " '{print $1, $2, $7, $8}'
4

Я думаю, что ответ @ John1024 не совсем корректен, так как префикс stdbuf -o0 на своем месте . Он относится как префикс к команде awk , а не к команде tail -f , поэтому правильная команда должна быть:

tail -f logfile.log | stdbuf -o0 awk -F" " '{print $1, $2, $7, $8}'

Также обратите внимание, что не все версии awk будут работать в этой конкретной конфигурации. Итак, если вам нужно, чтобы эта конкретная командная строка функционировала так, как написано, продолжайте пробовать различные версии awk/gawk/mawk, пока не найдете ту, которая работает.

2

Вы можете снять его, добавив цикл while, как показано в примере ниже. Я проверил это на работающем лог-файле, и это сработало для меня.

tail -f input.log | while read a; do echo "$a" | awk -F" " '{print $1, $2, $7, $8}' >> output.log; done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .