我有一个巨大的日志文件。我知道我可以在最后对它进行tar,但我希望文件在每10K行之后压缩,并确保没有数据丢失。
最终目标是停止增加文件大小并将其保持在特定限制。
只是示例代码: -
sh script.sh > log1.log &
现在,我想继续压缩log1.log,以便它永远不会超过特定的大小限制。
此致 阿沛
答案 0 :(得分:1)
让文件为file.txt,然后你就可以: -
x=$(wc -l file.txt|cut -f 1 -d " ")
if [[ $x >> 10000 ]]
then
sed '1,10000d' file.txt > file2.txt
fi
之后只需zip file2.txt并删除file2.txt
答案 1 :(得分:0)
考虑使用拆分命令。它可以按行,字节,模式等分割。
split -l 10000 log1.log `date "+%Y%m%d-%H%M%S-"`
这将拆分名为" log1.log"的文件。到一个或多个文件。每个文件将包含不超过10,000行。这些文件的名称类似于20180327-085711-aa,20180327-085711-ab等。对于非常大的日志文件,您可以使用split' s -a参数,以便在文件后缀中使用两个以上的字符
棘手的部分是你的shell脚本仍在写入文件。拆分内容后,必须截断日志。请注意,在拆分文件和截断文件之间存在一小段时间,因此某些日志记录数据可能会丢失。
此示例分为50,000个行文件:
$ wc log.text
528193 1237600 10371201 log.text
$ split -l 50000 log.text `date "+%Y%m%d-%H%M%S-"` && cat /dev/null > log.text
$ ls
20180327-090530-aa 20180327-090530-ae 20180327-090530-ai
20180327-090530-ab 20180327-090530-af 20180327-090530-aj
20180327-090530-ac 20180327-090530-ag 20180327-090530-ak
20180327-090530-ad 20180327-090530-ah log.text
$ wc 20180327-090530-aa
50000 117220 982777 20180327-090530-aa
如果您只想在文件达到特定大小(行数)时截断该文件,请将此split命令包装在定期运行的shell脚本中(例如通过cron)。这是检查文件大小的示例:
if (( `wc -l < log.text` > 1000000 ))
then
echo time to truncate
fi