将无限制的 curl stdout 管道传输到分块文件中

将无限制的 curl stdout 管道传输到分块文件中

我有一个 HTTP 端点,它提供无限的事件流。现在我想使用 curl 记录该流,但同时拆分记录的文件 - 最好基于行号以防止损坏。

我已经尝试过拆分,但似乎拆分在输入流结束之前什么也不做。

这是我的命令:

stdbuf -oL curl -s http://... | split -l1 - record.chunked.

为了测试:以下命令尝试将 ping 命令的结果拆分为每行 1 个文件。但它不起作用。

ping localhost | split -l1 - out.

还有其他方法(精简、简单、最好不需要脚本)可以做到这一点吗?

答案1

我知道您说过您想避免为此编写脚本,但我已经提出了一个非常简单的解决方案。请看一看:

#!/bin/bash
#
# read infinitely from /dev/stdin and print into files for every 100 lines
# Written by Guy Gastineau. 3/20/2019 - Free to use!
#

# create unique names for the logs
set_filename () {
  filename="${HOME}/eventlogs/$(date '+%Y-%m-%d_%H:%M:%S').log"
}

# error if eventlogs dir doesn't exist
if [[ ! -d ${HOME}/eventlogs ]]; then
  printf '%s\n' "~/eventlogs doesn't exist. Please create this directory" >&2
  exit 1
fi

# initialize vars
idx=0; set_filename

# read from stdin
while read -r line; do
  printf '%s\n' "$line" >> $filename # print to file
  $(( idx++ )) 2> /dev/null          # increment idx, and ignore output
  if [[ $idx -ge 100 ]]; then        # reset vars when idx gets to 100
    idx=0; set_filename
  fi
done

如果您希望将日志保存在其他位置,请随意更改文件名的基本路径。此外,更改第 25 行测试中的整数将更改在创建新文件之前放入每个文件的行数。

重要!只要该脚本可以从标准输入读取,它就会运行。

附言:我对此进行了测试,ping google.com | myscript并且效果非常好。

相关内容