
Мой пример использования следующий: у меня есть файл журнала Apache, в котором я регистрирую только json-данные из PHP. Из-за того, как Apache печатает журналы, мне приходится обрезать начало и конец каждой строки с помощью awk. Результатом является строка json, которую я хочу красиво вывести с помощью jq.
Чтобы передать из tail в awk, мне нужно использовать stdbuf. Полная команда, которую я придумал, выглядит так:
stdbuf -o0 tail -f -n 1 /var/log/apache2/error.log | awk '{print substr($0,83, length($0)- 166); }' | jq
что не работает. Я думаю, это из-за jq, но --stream или --unbuffered тоже не работают.
Кто-нибудь знает, как сделать то, что я хочу?
РЕДАКТИРОВАТЬ: Пример JSON будет таким:
{"foo": "bar"}
это будет отображено правильно, но если json записан во время работы tail, он не отобразится.
решение1
Я только что нашел решение: вам нужно «расбуферизовать» каждую команду с помощью stdbuf -oO. Так что это должно выглядеть так:
stdbuf -o0 tail -f -n 2 /var/log/apache2/error.log | stdbuf -o0 awk '{print substr($0,83, length($0)- 166); }' | jq