
У меня есть файл журнала, содержащий следующее содержимое.
2021-06-15T22:50:11+00:00 DEBUG {"slug": "something", "key2": "value2"}
Я хотел бы сохранить tail -f
этот файл и передать результаты в jq
команду, но мне нужно удалить 2021-06-15T22:50:11+00:00 DEBUG
часть перед передачей, jq
так как jq
ожидается строка JSON.
Есть ли способ отследить файл журнала и одновременно удалить часть даты и времени?
В конечном итоге я хотел бы использовать следующую команду.
tail -f :file | jq
решение1
Предположим, у вас есть доступ к GNU sed
, который может выполнять небуферизованный вывод:
tail -f file | sed -u 's/^[^{]*//' | jq .
Это будет работать tail -f
с вашим файлом и непрерывно отправлять новые данные в sed
. sed
Команда удалит все до пробела перед первым {
в строке, а затем отправит результат в jq
.
Опция -u
GNU sed
заставляет его не буферизовать вывод. Без этой опции sed
буферизировал бы результат и отправлял бы данные только jq
после заполнения буфера (4 Кб?). Выполнение буферизации таким образом является стандартной процедурой, когда вывод инструмента не является самим терминалом, и это делается из соображений эффективности. В этом случае мы можем захотеть отключить буферизацию, поэтому мы используем -u
.
Чтобы выбрать только строки, содержащие DEBUG
строку перед данными JSON:
tail -f file | sed -u -e '/^[^{]*DEBUG /!d' -e 's///' | jq .
или
tail -f file | sed -u -n 's/^[^{]*DEBUG //p' | jq .
Команда sed
здесь удалит все строки, которые не начинаются с текста, не содержащего {
символов, заканчивающегося на DEBUG
. Если такая строка найдена, соответствующий текст удаляется, оставляя данные JSON.
Обратите внимание, что здесь мы извлекаем JSON на основе DEBUG
строки, а не на основе {
, которая инициирует объект JSON.
Относится к буферизации в трубопроводах:
решение2
Чтобы удалить первые 2 столбца, разделенные пробелом:
tail -f file | stdbuf -oL cut -d ' ' -f3- | jq .
( stdbuf -oL
, как в системах GNU или FreeBSD, трюки, cut
позволяющие выполнять буферизацию вывода на основе строк, а не блоков).