使用 BASH 如何轮询 log.csv,使用 Tail 写入行组中的新 log.csv

Using BASH how can I poll a log.csv, writing to a new log.csv in line groups using Tail

一个应用程序正在不断地写入日志。每行形成一个新条目,日志为 csv 格式。示例:

123123123,asdf,asdf,3453456,sdfgsfgs,4567asd,zxc,aa
444444222,asdf,asdf,3453456,sdfgsfgs,4567asd,zxc,aa
563434535,asdf,asdf,3453456,sdfgsfgs,4567asd,zxc,aa
234234334,asdf,asdf,3453456,sdfgsfgs,4567asd,zxc,aa
234234534,asdf,asdf,3453456,sdfgsfgs,4567asd,zxc,aa
546456456,asdf,asdf,3453456,sdfgsfgs,4567asd,zxc,aa
567567567,asdf,asdf,3453456,sdfgsfgs,4567asd,zxc,aa
234232342,asdf,asdf,3453456,sdfgsfgs,4567asd,zxc,aa

我需要轮询日志并分块提取数据,将数据附加到另一个名为 newLog.csv

的日志文件

我需要确保; 我不复制已经移动到新文件的数据, 如果没有 200 行数据,那么它会捕获最接近的可用行数,而不会重复。

我可以更改此尾语句以满足上述要求吗?

tail -n 200 $REMOTE_HOME/data/log.csv >> $SCRIPT_DIR/$project/newLog.csv

如果字符串中的第一个数据是某种时间代码(unixtime?),您可以这样做:

1.Check 新日志中最后写入行的时间。

LAST_LINE=tail -n 1 /PATH/new_log | awk -F',' '{print }'

2.Check你要写的第一行

FIRST_LINE=tail -n 200 /PATH/old_log | head -n 1

3.If 新日志中的最后一行早于第 200 行的第一行写入 200 行

if [ $LAST_LINE -lt $FIRST_LINE ]
do tail -n 200 /PATH/old_log >> /PATH/new_log;done;

现在你必须把它放在一个循环中,让东西工作,例如。 3条线重叠。基本上你做的和以前一样,只需要列出最后 200 行以获得第一个新行。

LAST_LINE=tail -n 1 /PATH/new_log | awk -F',' '{print }'

COUNT=200;
while [  $COUNT -gt 0 ]; do
 FIRST_LINE=tail -n $COUNT /PATH/old_log | head -n 1
 if [ $LAST_LINE -lt $FIRST_LINE ]
 do tail -n $COUNT /PATH/old_log >> /PATH/new_log;break;done;
done