Как отформатировать потоковый вывод JSON из Node.js?

Я нашел решение:

Создайте файл .service в каталоге /etc/systemd/system

[Unit]
Description=some_script

[Service]
Type=simple
ExecStart=/home/user/scripts/some_script

Создайте файл .timer в том же каталоге, что и файл .service

[Unit]
Description=Runs some_script 5 mins after boot

[Timer]
OnBootSec=5min
Unit=some_script.service

[Install]
WantedBy=multi-user.target

Запустите и включите файл .timer

sudo systemctl start some_script.timer
sudo systemctl enable some_script.timer

Я читал эту страницу вики и этот блог

2
01.09.2016, 17:44
1 ответ

Предполагая наличие nстрок вывода не -JSON, следующий короткий сценарий передаст эти строки как есть и использует jqдля форматирования оставшихся строк. Предполагается, что входные данные поступают на стандартный ввод сценария, и сценарий берет число nиз первого аргумента командной строки (или по умолчанию равно 5, если этот аргумент не существует ).

#!/bin/sh

n=${1-5}

if [ "$n" -gt 0 ]; then
    head -n "$n"
fi

jq.

Сценарий предполагает, что команда headбудет потреблять ровно nстрок ввода. Существуют реализации head, которые не ведут себя подобным образом и будут считывать более nстрок, не оставляя ввода для обработки jq. GNU headведет себя в этом аспекте хорошо и работает так, как предполагалось.

Тестирование:

$ sh script.sh 2 <file.json
non-json text
on two lines
{
  "name": "myapp",
  "hostname": "myhost.local",
  "pid": 64662,
  "source_file_path": "/path/to/src/connector.js",
  "req_id": "2339717c-6c3b-4e51-a4b2-5c647efd9c25",
  "connector": "abc123",
  "level": "INFO",
  "req": {
    "method": "GET",
    "url": "http://backend/server/url"
  },
  "time": "2016-09-01T06:31:55.099Z",
  "v": 0,
  "message": "Outgoing request"
}

Ниже приводится вариант описанного выше, который добавляет очень упрощенное обнаружение начала содержимого JSON во входных данных. Предполагается, что документ JSON начинается с первой строки, в которой первым символом является {.

Сценарий сначала сохраняет входные данные во временный файл (, который удаляется после завершения сценария ), а затем дважды анализирует этот файл. Один раз, чтобы извлечь не -данные JSON, а затем еще раз, чтобы извлечь документ JSON.

#!/bin/sh

tmpfile=$(mktemp)
trap 'rm -f "$tmpfile"' EXIT

cat >"$tmpfile"

sed -n '/^[^{]/{p;d;}; q' <"$tmpfile"
sed -n '/^{/,$p'          <"$tmpfile" | jq.

Тестирование:

$ sh script.sh <file.json
non-json text
on two lines
{
  "name": "myapp",
  "hostname": "myhost.local",
  "pid": 64662,
  "source_file_path": "/path/to/src/connector.js",
  "req_id": "2339717c-6c3b-4e51-a4b2-5c647efd9c25",
  "connector": "abc123",
  "level": "INFO",
  "req": {
    "method": "GET",
    "url": "http://backend/server/url"
  },
  "time": "2016-09-01T06:31:55.099Z",
  "v": 0,
  "message": "Outgoing request"
}

Если использование временного файла кажется неэлегантным, тогда следующий вариант берет путь к входному файлу из командной строки:

#!/bin/sh

infile=$1

sed -n '/^[^{]/{p;d;}; q' <"$infile"
sed -n '/^{/,$p'          <"$infile" | jq.
0
27.01.2020, 22:45

Теги

Похожие вопросы