единственные jq управляют записью в различные файлы

Я сравнил описанное поведение между 5 разными серверами, и эта проблема возникает только при соединении с одним конкретным сервером.

После проверки контрольной суммы md5 я уверен, что файлы идентичны.

Поскольку предупреждение ни на что не влияет, я решил скрыть это сообщение.
На данный момент я изменил сценарий резервного копирования на сервере, поэтому в случае любого использования ssh он сначала записывает вывод в файл с помощью:>> $BACKUP_LOGS_FILE 2>&1в конце команды.

В самом конце скрипта я использую grep для фильтрации вывода:grep -v 'Connection to xxx.xxx.xxx.xxx closed by remote host.' $BACKUP_LOGS_FILE

Однако, если у кого-то есть какое-либо объяснение, что может быть причиной этого, не стесняйтесь добавлять свой ответ.

2
11.06.2018, 20:53
3 ответа

jqsolo escribe en stdout (o stderr ), por lo que necesita otro programa para dividir el flujo en diferentes archivos de registro.
Primero, enriquece el comando jsde @nwk con un campo de archivo de registro.

jq -c '(select(.type=="1") | {"logfile":.type},{fname:.fname}),
       (select(.type=="3") | {"logfile":.type},{city:.city})' test.log

Puede canalizar esta salida a awk, que puede recoger los nombres de archivo

jq -c '(select(.type=="1") | {"logfile":.type},{fname:.fname}),
       (select(.type=="3") | {"logfile":.type},{city:.city})' test.log |
       awk -F"\"" 'BEGIN {FPAT="[^{}:\"]+" } 
            $1=="logfile" {lf="type_"$2".txt"; next}
            {print >> lf}'
1
27.01.2020, 22:21

Puede ser más fácil usar un lenguaje completo -aquí. Me gusta:

perl -MJSON -ne '
  BEGIN{$j = JSON->new}
  $j->incr_parse($_);
  END{
    for $i ($j->incr_parse) {
      $t = delete($i->{type});
      $out{$t}.= to_json($i). "\n";
    }
    for $t (keys %out) {
      open OUT, ">", "type_$t.json" or die "type_$t.json: $!\n";
      print OUT $out{$t};
    }
  }' < input.json
1
27.01.2020, 22:21

Я пришел сюда в поисках быстрого ответа, но мне не понравился ни один из них, потому что мне не нравилась идея делать отдельный запрос для каждого файла.

Вы можете использовать опцию selectиз jqс каким-нибудь nix для разделения json на отдельные файлы.

jq -r '.type' test.log | uniq | xargs -i bash -c "jq '. | select(.type==\"{}\" )' test.log > \"{}.json\""

Объяснение:

  • Используйте jq, чтобы получить все поля, для которых вы хотите создать файлы
  • uniqделает список уникальным
  • xargsэтот список
  • bash -cтак что вы можете перенаправить каждый вызов на jqв свой собственный файл
  • Снова используйте jq, чтобы выбрать из исходного файла журнала только те части данных, которые вам нужны, и записать их в отдельный файл.

Это существенно автоматизирует процесс многократного вызова jqфайла

0
18.06.2021, 16:41

Теги

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