我有一个 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
并且效果非常好。