Linux中大文件分割的騷操作

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

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

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

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

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

1 查閱大文件之痛

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

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

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

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

2.1 根據行數切割

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

 右邊滑動查看完整命令

#源文件大小[root@VM_3_50_centos split]# ls -l 2020011702-www.happylauliu.cn.gz -h-rw-r--r-- 1 root root 3.4G 1月  17 09:42 2020011702-www.happylauliu.cn.gz
#按行切割[root@~]# split -l 50000 -d --verbose 2020011702-www.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@VM_3_50_centos split]# wc -l split-line0050000 split-line00[root@VM_3_50_centos split]# wc -l split-line0150000 split-line01[root@VM_3_50_centos split]# wc -l split-line917050000 split-line9170[root@VM_3_50_centos split]# wc -l split-line91711020 split-line9171
#查看文件大小[root@VM_3_50_centos split]# 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 2020011702-www.happylauliu.cn.gz split-size正在創建文件"split-size00"正在創建文件"split-size01"正在創建文件"split-size02"正在創建文件"split-size03"正在創建文件"split-size04"正在創建文件"split-size05"正在創建文件"split-size06"
[root@VM_3_50_centos split]# 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@VM_3_50_centos split]# cat split-size01 split-size02 >two-file-merge
[root@VM_3_50_centos split]# ls -lh two-file-merge-rw-r--r-- 1 root root 1000M 1月  17 17:20 two-file-merge

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

###############################

本文轉自:https://mp.weixin.qq.com/s/33QKfPJTC3K5LR3s4jB58g

如需轉載請註明原文出處

###############################

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章