从文件中收集每 n 行

从文件中收集每 n 行

我有一个巨大的日志文件,需要通过 HTTP 进行流式传输。出于性能原因,我想捕获/收集每一个n行并将其发送过去。所以,基本上,我想要的是文件的 n 行缓冲输出。是否有 tail/head 或任何其他 Linux 命令来实现此目的?

答案1

我建议awk将分割和单独inotifywait监视“传出数据”目录结合起来。例如,创建一个名为“outgoing”的目录,每当出现新文件时,我们都会将其发送出去。

脚本1awk每隔 10 行进行分割,并以递增的数字 X 写入新文件“bufferX” - 根据需要进行调整。

$cat split.awk

NR%10==1 {buffer="buffer"++i}

{
print > buffer
if (NR%%10==0) {system("mv "buffer" outgoing/")}
}

脚本2:监视传出目录并在出现新的日志批次时发送数据。我只是假设您用于curl发送 - 相应地进行调整。

$cat watch_dir.sh

#!/bin/bash
inotifywait -m -o watch.logs -e moved_to --format '%w%f' outgoing/  |\
while read bufferfile
do
    curl -T ${bufferfile} http://taget.url && rm ${bufferfile}
done

这里inotifywait监视目录“传出”-e的文件的出口,以监视器模式moved_to无限地运行,l gs 到“watch.logs”并使用路径和文件名打印检测到的文件。最后一部分我们阅读命令并在上传后删除文件。-m-o--formatcurl

创建传出目录,然后运行:

bash watchdir.sh & <your_command_creating_output> | awk -f split.awk

相关内容