Отслеживание файла и удаление даты и времени

Отслеживание файла и удаление даты и времени

У меня есть файл журнала, содержащий следующее содержимое.

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.

Опция -uGNU 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позволяющие выполнять буферизацию вывода на основе строк, а не блоков).

Связанный контент