分割大型日志文件而不保留原始文件(就地分割)

分割大型日志文件而不保留原始文件(就地分割)

我有一个 226GB 的日志文件,我想split将其分成几块以便于xz阅读。问题是我的可用空间只剩下 177GB。

有没有办法将split文件分成两半或两半无需保留原始的额外副本?

    $ split myFile.txt
    $ ls -halF
-rw-r--r--   1 user group 35 Dec 29 13:17 myFile.txt
-rw-r--r--   1 user group 8 Dec 29 13:18 xaa
-rw-r--r--   1 user group 3 Dec 29 13:18 xab
-rw-r--r--   1 user group 5 Dec 29 13:18 xac
-rw-r--r--   1 user group 10 Dec 29 13:18 xad
-rw-r--r--   1 user group 8 Dec 29 13:18 xae
-rw-r--r--   1 user group 1 Dec 29 13:18 xaf

我宁愿没有剩余的 myFile.txt,只保留分割文件。我很乐意坚持默认行为并删除原始文件,但我没有足够的空间来完成此操作。

我不是专家sed,但awk我认为也许有一种方法可以通过其中一种实现“移除到另一个文件”之类的行为?

答案1

可能有效的是将其部分直接流式传输到xz- 我猜你可以压缩一个日志文件,足以将原始部分和压缩部分都放入剩余空间。

  1. 获取行数:

    wc -l myFile.txt
    
  2. 将其分成任意多个部分,例如每部分 10k 行。
  3. 使用sed管道将您想要的部分输入到xz

    sed -n '1,10000p' myFile.txt | xz > outfile01.xz 
    sed -n '10001,20000p' myFile.txt | xz > outfile02.xz
    

等等。这当然可以通过脚本来完成。

但老实说,按照 EEAA 所说的去做......

答案2

你可以连续化身尾巴和截短从大文件的末尾切掉一些块。

就像是

tail -n 10000 myFile.txt > myFile.001.txt
truncate -s -$(wc -c myFile.001.txt) myFile.txt
xz myFile.001.txt
rm myFile.001.txt

您也可以编写脚本。不过,它可能需要一段时间才能运行,最好是在机外处理。

相关内容