Стандартный вывод с несколькими строками для отдельных файлов - PullRequest
0 голосов
/ 20 мая 2019

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

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

Вывод в следующем формате:

AVRO MESSAGE (1): {Data in JSON format}
AVRO MESSAGE (2): {Data in JSON format}
AVRO MESSAGE (3): {Data in JSON format}
AVRO MESSAGE (4): {Data in JSON format}

Я хочу, чтобы строка 1 входила в файл с именем output1.txt или output20190518113126104, строка 2 - в файл с именем output2.txt или output20190518113126351, где имя с меткой времени - YYYYMMDDHHmmssSSS или что-то подобное, чтобы гарантировать, что оно уникально.

Ответы [ 3 ]

3 голосов
/ 20 мая 2019

Используйте split с параметром l (строки) и считайте 1

cmd | split -l1

Если вам нужен префикс для ваших выходных файлов, вы можете использовать

 split -l1 <(cmd) output

EDIT:
Как предлагается в комментарии, вы можете форсировать числовой вывод с помощью -d и позволить split читать из stdin с помощью -. Это делает:

cmd | split -l1 -d - output
2 голосов
/ 20 мая 2019
foo | awk '{out="output" NR ".txt"; print > out; close(out)}'

замените foo любой командой, которая генерирует ваш вывод.

0 голосов
/ 20 мая 2019

Я бы выбрал решение awk, представленное Эдом Мортоном.Канонический метод (IMO) в оболочке будет выглядеть следующим образом:

cmd | { i=1; while IFS= read -r line; do printf '%s\n' "$line" > output.$((i++)); done; }

Вы можете предпочесть цикл for, но IMO не так чист, поскольку вы не можете написать for((i=1; read line; i++)), как вам хотелось бы.(Второе выражение не может быть командой).например:

cmd | for ((i=1;; i++)); do IFS= read -r line || break; printf '%s\n' "$line" > output.$i; done;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...