日志文件的大小:10 GB
分区中的可用空间:6 GB
需要将日志文件拆分成更小的块,然后gzip这些。 但是没有足够的空间来运行诸如split(1)之类的东西,这会使原始文件完好无损。 那会让我们失望
原始日志文件:10 GB
分割输出:另外10 GB
有没有办法内联分割文件,或者做这样的事情:
$ tail -nnn bigfile.txt> piece.txt
$ some-command -nnn bigfile.txt#只截断最后的nnn行
$ gzip piece.txt
(重复)
find像“一些命令”这样的工具也可以。
这是我将如何做到这一点 –
决定在一个分割文件中需要多less行日志。 您还需要确保您的可用空间等于分割文件大小。 举个例子,假设有10000行。
首先,将日志行复制到目标文件中
head -n 10000 source.log | gzip -c > split001.log.gz
接下来,使用sed来就地删除刚刚复制的行
sed -i '1,10000d' source.log
只需稍加努力,就可以将上述代码封装在脚本中,直到源代码文件为空,并沿途添加分割文件名。
—编辑—
好吧,我会救你的麻烦 –
#!/bin/bash if [ $# -ne 3 ] then echo "usage: $0 <source file> <target prefix> <N lines per chunk>" exit fi filename=$1 target_stem=$2 target_lines=$3 numlines=`wc -l $filename | cut -f1 -d' '` count=1; while [ $numlines -gt 0 ] do head -n $target_lines $filename | gzip -c > ${target_stem}${count}.txt.gz sed -i "1,${target_lines}d" $filename numlines=`wc -l $filename | cut -f1 -d' '` let "count = $count + 1" done
你可以使用split命令来定义字节,大小,行:
split -db 10k bigfile.txt bigfile_
注意:输出文件将是bigfile_N,因为我们正在使用-d开关。
使用开关-l我们可以定义线的数量,例如:
split -dl 1000 bigfile.txt bigfile_
你可以定期停止这个工作(Ctrl + Z),然后gzip这些碎片,然后用“fg”恢复停止的工作。