Linux大文件切割


日常工作中需要對日志文件進行分析,當日志文件過大時,Linux中使用vim、cat、grep、awk等這些工具對大文件日志進行分析將會成為夢魘,具體表現在:

  • 執行速度緩慢,文件內容需要加載到內存中,涉及大量的磁盤讀;

  • 耗費資源過多,一個4G空間的日志文件需要至少4G的內存,更大的呢?

  • 內容難以復用,分析過濾文件時會用管道對輸出文件進行處理,大文件下難以復用;

  • 文件傳輸困難,大文件需要傳輸給其他人進行分析,文件太大,全量傳輸帶寬耗費大

1 查閱大文件之痛

大數據離線處理框架hadoop可以處理這些場景,然而hadoop也需要耗費較長的時間進行計算,而且還需要去編寫MapReduce任務,誠然這種方法帶來更大的難度和挑戰。hadoop是通過將大文件切割成多個小文件,通過多個mapreduce任務做並行處理,Linux提供了一個簡單易用的split工具,可以實現將文件切割成多個小文件。

split提供兩種方式對文件進行切割:

  • 根據行數切割,通過-l參數指定需要切割的行數

  • 根據大小切割,通過-b參數指定需要切割的大小

2.1 根據行數切割

本地沒有大日志,就拿小日志進行演示,指定文件名為split-line,-d參數以數字的方式顯示

[root@iZ1la3d1xbmukrZ ~]# wc -l err_20190907.log
3427 err_20190907.log
[root@iZ1la3d1xbmukrZ ~]# split -l 300 -d --verbose err_20190907.log split-line
creating file ‘split-line00’
creating file ‘split-line01’
creating file ‘split-line02’
creating file ‘split-line03’
creating file ‘split-line04’
creating file ‘split-line05’
creating file ‘split-line06’
creating file ‘split-line07’
creating file ‘split-line08’
creating file ‘split-line09’
creating file ‘split-line10’
creating file ‘split-line11’
[root@iZ1la3d1xbmukrZ ~]# ls -lh split-line0[0-9]
-rw-r--r-- 1 root root 28K Mar 11 19:50 split-line00
-rw-r--r-- 1 root root 27K Mar 11 19:50 split-line01
-rw-r--r-- 1 root root 24K Mar 11 19:50 split-line02
-rw-r--r-- 1 root root 24K Mar 11 19:50 split-line03
-rw-r--r-- 1 root root 23K Mar 11 19:50 split-line04
-rw-r--r-- 1 root root 18K Mar 11 19:50 split-line05
-rw-r--r-- 1 root root 26K Mar 11 19:50 split-line06
-rw-r--r-- 1 root root 25K Mar 11 19:50 split-line07
-rw-r--r-- 1 root root 24K Mar 11 19:50 split-line08
-rw-r--r-- 1 root root 24K Mar 11 19:50 split-line09

指定行數后會自動做切割,即達到300行之后自動切割,通過-d參數文件名會自動以數字的方式命名,切割后,每個文件大小為24K,此時再對文件進行分析將會方便很多,同時文件數量也會很多,可以增加行數的方式進行切割,方便分析。

2.2 根據大小切割

除了按照行數切割之外,split還支持通過文件大小進行切割,通過指定-b參數指定文件大小進行切割,文件大小單位支持K, M, G, T, P, E, Z,如下以切割為30K演示文件切割過程

[root@iZ1la3d1xbmukrZ ~]# split -b 30K -d --verbose err_20190907.log split-size
creating file ‘split-size00’
creating file ‘split-size01’
creating file ‘split-size02’
creating file ‘split-size03’
creating file ‘split-size04’
creating file ‘split-size05’
creating file ‘split-size06’
creating file ‘split-size07’
creating file ‘split-size08’
creating file ‘split-size09’
[root@iZ1la3d1xbmukrZ ~]# ll -h
total 916K
-rw-r--r--  1 root root 273K Mar 11 19:47 err_20190907.log
-rw-r--r--  1 root root  28K Mar 11 19:50 split-line00
-rw-r--r--  1 root root  27K Mar 11 19:50 split-line01
-rw-r--r--  1 root root  24K Mar 11 19:50 split-line02
-rw-r--r--  1 root root  24K Mar 11 19:50 split-line03
-rw-r--r--  1 root root  23K Mar 11 19:50 split-line04
-rw-r--r--  1 root root  18K Mar 11 19:50 split-line05
-rw-r--r--  1 root root  26K Mar 11 19:50 split-line06
-rw-r--r--  1 root root  25K Mar 11 19:50 split-line07
-rw-r--r--  1 root root  24K Mar 11 19:50 split-line08
-rw-r--r--  1 root root  24K Mar 11 19:50 split-line09
-rw-r--r--  1 root root  24K Mar 11 19:50 split-line10
-rw-r--r--  1 root root 9.8K Mar 11 19:50 split-line11
-rw-r--r--  1 root root  30K Mar 11 19:52 split-size00
-rw-r--r--  1 root root  30K Mar 11 19:52 split-size01
-rw-r--r--  1 root root  30K Mar 11 19:52 split-size02
-rw-r--r--  1 root root  30K Mar 11 19:52 split-size03
-rw-r--r--  1 root root  30K Mar 11 19:52 split-size04
-rw-r--r--  1 root root  30K Mar 11 19:52 split-size05
-rw-r--r--  1 root root  30K Mar 11 19:52 split-size06
-rw-r--r--  1 root root  30K Mar 11 19:52 split-size07
-rw-r--r--  1 root root  30K Mar 11 19:52 split-size08
-rw-r--r--  1 root root 2.8K Mar 11 19:52 split-size09
drwxr-xr-x 13 root root 4.0K Mar  3 18:03 utils
[root@iZ1la3d1xbmukrZ ~]#

2.3 多文件合並

split將大文件切割為多個小文件,如果需要將多個小文件合並為一個文件怎么處理呢?
可以使用文件重定向方式實現,如下演示兩個小文件合並為一個文件

 右邊滑動查看完整命令

[root@iZ1la3d1xbmukrZ ~]# cat split-line00 split-line01 >two-file-merge
[root@iZ1la3d1xbmukrZ ~]# ll
total 624
-rw-r--r--  1 root root 279331 Mar 11 19:47 err_20190907.log
-rw-r--r--  1 root root  28017 Mar 11 19:50 split-line00
-rw-r--r--  1 root root  27386 Mar 11 19:50 split-line01
-rw-r--r--  1 root root  24354 Mar 11 19:50 split-line02
-rw-r--r--  1 root root  24409 Mar 11 19:50 split-line03
-rw-r--r--  1 root root  23434 Mar 11 19:50 split-line04
-rw-r--r--  1 root root  18207 Mar 11 19:50 split-line05
-rw-r--r--  1 root root  26139 Mar 11 19:50 split-line06
-rw-r--r--  1 root root  25057 Mar 11 19:50 split-line07
-rw-r--r--  1 root root  24536 Mar 11 19:50 split-line08
-rw-r--r--  1 root root  23926 Mar 11 19:50 split-line09
-rw-r--r--  1 root root  23863 Mar 11 19:50 split-line10
-rw-r--r--  1 root root  10003 Mar 11 19:50 split-line11
-rw-r--r--  1 root root  55403 Mar 11 19:51 two-file-merge

合並方式通過讀取文件的方式+輸出重定向,對於大文件一樣會存在性能的問題,建議根據需要使用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM