将stdout用多行管道传输到单个文件

时间:2019-05-20 14:10:47

标签: linux bash

我有一个kafka用户,它反序列化avro消息并打印到stdout。我想将输出通过管道传输到文件中,但是希望为每条消息使用一个单独的文件-并非所有消息都在一个文件中。

我已经搜索过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}

我希望第一行进入名为output1.txt或output20190518113126104的文件,第二行希望进入名为output2.txt或output20190518113126351的文件 带时间戳的名称为YYYYMMDDHHmmssSSS或类似的名称(确保其唯一)。

3 个答案:

答案 0 :(得分:3)

1.0.1与选项split(行)一起使用并计数1

l

当您想要输出文件的前缀时,可以使用

cmd | split -l1

编辑:
如注释中所建议,您可以使用 split -l1 <(cmd) output 设置数字输出,并使用-dsplit从标准输入中读取。这使得:

-

答案 1 :(得分:2)

foo | awk '{out="output" NR ".txt"; print > out; close(out)}'

用当前正在生成输出的任何命令替换foo

答案 2 :(得分:0)

我会使用Ed Morton提出的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;