1. 程式人生 > 其它 >實戰|Linux大檔案切割

實戰|Linux大檔案切割


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

  • 執行速度緩慢,檔案內容需要載入到記憶體中,涉及大量的磁碟讀;

  • 耗費資源過多,一個4G空間的日誌檔案需要至少4G的記憶體,更大的呢?

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

  • 檔案傳輸困難,大檔案需要傳輸給其他人進行分析,檔案太大,全量傳輸頻寬耗費大。

1 查閱大檔案之痛

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

split提供兩種方式對檔案進行切割:

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

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

2.1 根據行數切割

如下以一個3.4G大小的日誌檔案做切割演示,每一個檔案按照50000行做切割,指定檔名為split-line,-d引數以數字的方式顯示

右邊滑動檢視完整命令

#原始檔大小
[root@~]#ls-lhhappylauliu.cn.gz
-rw-r--r-- 1 root root 3.4G 1月  17 09:42 happylauliu.cn.gz


#按行切割
[root@~]# split -l 50000 -d --verbose happylauliu.cn.gz split-line
正在建立檔案"split-line00"
正在建立檔案"split-line01"
正在建立檔案"split-line02"
正在建立檔案"split-line03"
正在建立檔案"split-line04"
正在建立檔案"split-line05"
正在建立檔案"split-line06"
正在建立檔案"split-line07"
正在建立檔案"split-line08"
正在建立檔案"split-line09"
正在建立檔案"split-line10"
...
正在建立檔案"split-line9168"
正在建立檔案"split-line9169"
正在建立檔案"split-line9170"
正在建立檔案"split-line9171"


#檢視切割檔案行數確認
[root@~]# wc -l split-line00
50000split-line00
[root@~]# wc -l split-line9170
50000 split-line9170
[root@~]# wc -l split-line9171
1020split-line9171


#檢視檔案大小
[root@~]# ls -lh split-line0[0-9]
-rw-r--r-- 1 root root 14M 1月  17 16:54 split-line00
-rw-r--r-- 1 root root 14M 1月  17 16:54 split-line01
-rw-r--r-- 1 root root 14M 1月  17 16:54 split-line02
-rw-r--r-- 1 root root 14M 1月  17 16:54 split-line03
-rw-r--r-- 1 root root 14M 1月  17 16:54 split-line04
-rw-r--r-- 1 root root 14M 1月  17 16:54 split-line05
-rw-r--r-- 1 root root 14M 1月  17 16:54 split-line06
-rw-r--r-- 1 root root 14M 1月  17 16:54 split-line07
-rw-r--r-- 1 root root 14M 1月  17 16:54 split-line08
-rw-r--r-- 1 root root 14M 1月  17 16:54 split-line09

指定行數後會自動做切割,即達到5000行之後自動切割,通過-d引數檔名會自動以數字的方式命名,切割後,每個檔案大小為14M,此時再對檔案進行分析將會方便很多,同時檔案數量也會很多,可以增加行數的方式進行切割,方便分析。

2.2 根據大小切割

除了按照行數切割之外,split還支援通過檔案大小進行切割,通過指定-b引數指定檔案大小進行切割,檔案大小單位支援K, M, G, T, P, E, Z,如下以切割為500M演示檔案切割過程

右邊滑動檢視完整命令

[root@~]# split -b 500M -d --verbose happylauliu.cn.gz split-size
正在建立檔案"split-size00"
正在建立檔案"split-size01"
正在建立檔案"split-size02"
正在建立檔案"split-size03"
正在建立檔案"split-size04"
正在建立檔案"split-size05"
正在建立檔案"split-size06"


[root@~]# ls -lh split-size0*
-rw-r--r-- 1 root root 500M 1月  17 17:03 split-size00
-rw-r--r-- 1 root root 500M 1月  17 17:03 split-size01
-rw-r--r-- 1 root root 500M 1月  17 17:04 split-size02
-rw-r--r-- 1 root root 500M 1月  17 17:04 split-size03
-rw-r--r-- 1 root root 500M 1月  17 17:04 split-size04
-rw-r--r-- 1 root root 500M 1月  17 17:04 split-size05
-rw-r--r-- 1 root root 444M 1月  17 17:04 split-size06

2.3 多檔案合併

split將大檔案切割為多個小檔案,如果需要將多個小檔案合併為一個檔案怎麼處理呢?

可以使用檔案重定向方式實現,如下演示兩個小檔案合併為一個檔案

右邊滑動檢視完整命令

[root@~]# cat split-size01 split-size02 >two-file-merge


[root@~]# ls -lh two-file-merge
-rw-r--r-- 1 root root 1000M 1月  17 17:20 two-file-merge

合併方式通過讀取檔案的方式+輸出重定向,對於大檔案一樣會存在效能的問題,建議根據需要使用。