Linux 有幾個實用程序可以將大文件分解為小文件。 Split 和 csplit 是用於此目的的兩個流行命令。 這些實用程序將有助於分解大日誌文件甚至存檔文件,使其成為更小的文件。 這將便於將大文件拆分為更小的文件,以便它適合 USB 等較小的媒體存儲設備以滿足我們的目的。 通過這種技術,我們甚至可以加速網絡文件傳輸,因為小文件的並行傳輸通常更快。
在本教程中,我將詳細解釋如何使用這些 split 和 csplit 實用程序來分解 Linux 中的大文件。
分裂
要將大文件拆分為小文件,我們可以在 Linux 中使用此命令實用程序。
Syntax
split [options] filename prefix
您可以將 filename 替換為要拆分的大文件的名稱。 並用您希望為小輸出文件命名的“前綴”。 你可以排除 [options],或將其替換為以下任一項:
-a –suffix-length=N use suffixes of length N (default 2)
-b –bytes=SIZE put SIZE bytes per output file
-C –line-bytes=SIZE put at most SIZE bytes of lines per output file
-d –numeric-suffixes use numeric suffixes instead of alphabetic
-l –lines=NUMBER put NUMBER lines per output file
split 命令將為它創建的每個輸出文件提供名稱前綴,並在末尾附加一個指示其順序的擴展名。 默認情況下,split 命令將 aa 添加到第一個輸出文件中,按照字母順序進行 zz
用於後續文件。 默認情況下,大多數係統使用 x
作為前綴。
拆分示例
Split 命令將文件拆分為每個文件的 n 行,並將文件命名為 PREFIXaa, PREFIXab, PREFIXac,
等等。 默認情況下,前綴是 x
,行數為 1000
每個文件的行。
默認情況下將文件拆分為多個部分
我有我的日誌文件,即 1099 行的系統日誌,讓我們看看使用此命令拆分後的日誌文件的狀態。
# cat systemlog | wc -l
1099
# split systemlog
# ll
total 160
-rw-rw-r-- 1 root root 76294 Mar 25 12:02 systemlog
-rw-r--r-- 1 root root 68251 Mar 25 12:07 xaa
-rw-r--r-- 1 root root 8043 Mar 25 12:07 xab
# cat xaa | wc -l
1000
# cat xab | wc -l
99
該命令將日誌文件拆分為兩個文件 xaa and xab,
第一個有 1000 行,並將剩餘的轉儲到第二個文件中。
根據行數拆分文件
我們可以使用 -l 選項根據行數將文件拆分為多個部分。 在這裡,我正在分裂我的 system log
將 1099 行的文件分成每個 200 行的較小文件。 讓我們看看相同的命令:
# split -l 200 systemlog
# ll
total 172
-rw-rw-r-- 1 root root 76294 Mar 25 12:02 systemlog
-rw-r--r-- 1 root root 14369 Mar 25 12:16 xaa
-rw-r--r-- 1 root root 12795 Mar 25 12:16 xab
-rw-r--r-- 1 root root 13566 Mar 25 12:16 xac
-rw-r--r-- 1 root root 13681 Mar 25 12:16 xad
-rw-r--r-- 1 root root 13840 Mar 25 12:16 xae
-rw-r--r-- 1 root root 8043 Mar 25 12:16 xaf
# cat xaa | wc -l; cat xab | wc -l; cat xac | wc -l; cat xad | wc -l; cat xae | wc -l; cat xaf | wc -l
200
200
200
200
200
99
您可以看到該命令已將我的日誌文件拆分為五個較小的文件,每個文件 200 行,最後一個文件包含剩餘的行。
將一個大文件拆分為 500MB 的文件
您可以使用選項 -b 來指定拆分文件所需的大小限制。 請參閱我用於拆分我的這個命令 1GB Apache log
文件分成兩個 500MB 的文件。
# split -b 500MB httpd.log
# ll -lh
total 1.9G
-rw-r--r-- 1 root root 954M Mar 25 12:35 httpd.log
-rw-r--r-- 1 root root 477M Mar 25 12:38 xaa
-rw-r--r-- 1 root root 477M Mar 25 12:38 xab
使用給定的前綴將大文件拆分為 200MB 的文件
您可以使用選項 -b 指定 200M 文件大小和所需的前綴作為第二個參數。 請參閱我用來分割我的 1GB 的命令 Apache 使用名為的前綴登錄到 200MB 文件 split.log
以下:
# split -b 200M httpd.log split.log
# ll -lh
total 1.9G
-rw-r--r-- 1 root root 954M Mar 25 12:35 httpd.log
-rw-r--r-- 1 root root 200M Mar 25 12:52 split.logaa
-rw-r--r-- 1 root root 200M Mar 25 12:52 split.logab
-rw-r--r-- 1 root root 200M Mar 25 12:52 split.logac
-rw-r--r-- 1 root root 200M Mar 25 12:52 split.logad
-rw-r--r-- 1 root root 154M Mar 25 12:52 split.logae
在這 example,您可以看到我的日誌文件被分解為 200MB 的文件,並帶有我所需的前綴。
拆分文件並用數字命名
您可以使用該選項 -d
將帶有數字後綴的文件命名為 00、01、02 .. 等,而不是 aa、ab、ac。 請參閱我用來分割我的 1GB 的命令 Apache 使用名為 log 的前綴記錄到 200MB 的文件,並使用選項 -d 而不是下面的字母將數字添加到後綴:
# split -d -b 200M httpd.log log
# ll -lh
total 1.9G
-rw-r--r-- 1 root root 954M Mar 25 12:35 httpd.log
-rw-r--r-- 1 root root 200M Mar 25 12:58 log00
-rw-r--r-- 1 root root 200M Mar 25 12:58 log01
-rw-r--r-- 1 root root 200M Mar 25 12:58 log02
-rw-r--r-- 1 root root 200M Mar 25 12:58 log03
-rw-r--r-- 1 root root 154M Mar 25 12:58 log04
您可以使用以下命令查看 split 命令的手冊頁 man split
查看更多信息。
分裂
Csplit 是另一個命令實用程序,它將單個文件分成由上下文行確定的多個文件。
句法
csplit [option]... filename pattern.
csplit 創建的文件通常具有以下形式的名稱
xx號碼
其中 number 是從零開始的兩位十進制數,對於 csplit 創建的每個新文件,它都會遞增 1。
csplit 還顯示它作為輸出創建的每個文件的大小(以字節為單位)。
Options
-A, uses uppercase letters in place of numbers in the number portion of output file names like xxAA, xxAB, and so on.
-a, uses lowercase letters in place of numbers in the number portion of output file names like xxaa, xxab, and so on.
-f prefix, specifies a prefix to use in place of the default xx when naming files. If prefix causes a file name longer than NAME_MAX bytes an error occurs and csplit exits without creating any files.
-k, leaves all created files intact. Normally, when an error occurs, csplit removes files that it has created.
-n number, specifies the number of digits in the number portion of created file names.
-s, suppresses the display of file sizes.
Csplit 示例
默認情況下,csplit 在輸出中生成的文件以 ‘xx’ 作為前綴,輸出中生成的數字是命令生成的文件的字節數。
根據行數拆分文件
我有一個包含 8 行域名的文件,我的要求是在第四行拆分該文件,然後可以通過在命令和文件名之後將 ‘4’ 作為命令行參數傳遞來完成此操作。
For example, in our case, domainslist contains the following information: # cat domainslist domain1.com domain2.com domain3.com domain4.com domain5.com domain6.com domain7.com domain8.com
通過將 4 作為命令行參數傳遞,此命令將我們的 domainslist
文件在第 4 行。 輸出中產生的數字是命令產生的文件的字節數。 顯然,輸出中產生了兩個文件,分別是 xx00 和 xx01。
# csplit domainslist 4
36
60
# ll
total 20
-rw-r--r-- 1 root root 96 Mar 25 14:08 domainslist
-rw-r--r-- 1 root root 36 Mar 25 14:08 xx00
-rw-r--r-- 1 root root 60 Mar 25 14:08 xx01
# cat xx00
domain1.com
domain2.com
domain3.com
# cat xx01
domain4.com
domain5.com
domain6.com
使用正則表達式拆分文件
我們可以在 csplit 命令中使用正則表達式。 為了 example, 在前一種情況下,如果您希望該命令再次重複該模式,則可以使用以下命令執行此操作:
# csplit domainslist 4 {1}
36
48
12
# ll
total 24
-rw-r--r-- 1 root root 96 Mar 25 14:08 domainslist
-rw-r--r-- 1 root root 36 Mar 25 15:13 xx00
-rw-r--r-- 1 root root 48 Mar 25 15:13 xx01
-rw-r--r-- 1 root root 12 Mar 25 15:13 xx02
在這種情況下,我們可以獲得三個輸出文件。
# cat xx00
domain1.com
domain2.com
domain3.com
# cat xx01
domain4.com
domain5.com
domain6.com
domain7.com
# cat xx02
domain8.com
您可以使用 asterisk wildcard {*}
告訴 csplit 盡可能多地重複你的分割。
使用給定前綴拆分文件
默認情況下,csplit 拆分文件並生成以 xx 作為前綴的輸出文件。 但是,如果需要,您可以使用 option -f
在帶有必需前綴的命令行中。
為了 example,以下命令將生成以“域”為前綴的文件。
# csplit domainslist 4 {1} -f domain
36
48
12
# ll
total 24
-rw-r--r-- 1 root root 36 Mar 25 15:16 domain00
-rw-r--r-- 1 root root 48 Mar 25 15:16 domain01
-rw-r--r-- 1 root root 12 Mar 25 15:16 domain02
-rw-r--r-- 1 root root 96 Mar 25 14:08 domainslist
通過抑制與輸入模式匹配的行來拆分文件
這個 csplit 命令提供了一個選項來抑制匹配輸入模式的行。 有問題的選項是 --suppress-matched
.
為了 example,以下命令在第 4 行拆分我們的文件(xx00 將包含最多第 3 行,而 xx11 將包含除第 4 行之外的其餘行)。
# csplit --suppress-matched domainslist 4
36
48
# ll
total 20
-rw-r--r-- 1 root root 96 Mar 25 14:08 domainslist
-rw-r--r-- 1 root root 36 Mar 25 15:27 xx00
-rw-r--r-- 1 root root 48 Mar 25 15:27 xx01
# cat xx00
domain1.com
domain2.com
domain3.com
# cat xx01
domain5.com
domain6.com
domain7.com
自定義輸出文件名稱中的位數
默認情況下,輸出文件名中前綴後面的位數是 2。我們可以使用這個 option -n
自定義輸出文件名中前綴後面的位數。 為了 example, 如果你想要像 xx001 這樣的名字,你可以使用命令行選項,它需要輸入數字來表示數字的數量,比如 -n 3
如下:
# csplit -n 3 domainslist 4
36
60
# ll
-rw-r--r-- 1 root root 96 Mar 25 14:08 domainslist
-rw-r--r-- 1 root root 36 Mar 25 15:34 xx000
-rw-r--r-- 1 root root 60 Mar 25 15:34 xx001
強制 csplit 保存輸出文件以防出錯
默認情況下,csplit 會刪除在出現任何錯誤情況時創建的輸出文件。 但是,如果您想通過使用 -k option
在命令中。 請檢查這個 example 查看使用和不使用 -k 選項執行此命令的差異。
默認情況下,csplit 會刪除在出現任何錯誤情況時創建的輸出文件。 但是,我們可以通過在命令中使用“-k”選項來強制保存此輸出文件。 請檢查這個 example 查看使用和不使用 -k 選項執行此命令的差異。 在這第一 example,該命令是為了在第 3 行拆分我們的文件 ‘domainslist’ 並重複該命令兩次,這意味著它也應該在第 3 行拆分第二個文件,並且應該再次重複。 但是由於我們的源文件只有八行,所以在第一次拆分後它會重複一次但由於範圍不足而無法迭代兩次。 因此,由於此錯誤,不會產生任何輸出文件。
# csplit domainslist 3 {2}
24
36
36
csplit: ‘3’: line number out of range on repetition 2
# ll
total 12
drwxr-xr-x 2 root root 4096 Mar 25 15:41 ./
drwxr-xr-x 4 root root 4096 Mar 25 14:07 ../
-rw-r--r-- 1 root root 96 Mar 25 14:08 domainslist
但是當我們使用這個選項 -k 執行相同的命令時,輸出文件沒有被刪除。 請看下面的結果:
# csplit -k domainslist 3 {2}
24
36
36
csplit: ‘3’: line number out of range on repetition 2
# ll
total 24
-rw-r--r-- 1 root root 96 Mar 25 14:08 domainslist
-rw-r--r-- 1 root root 24 Mar 25 15:41 xx00
-rw-r--r-- 1 root root 36 Mar 25 15:41 xx01
-rw-r--r-- 1 root root 36 Mar 25 15:41 xx02
# cat xx00
domain1.com
domain2.com
# cat xx01
domain3.com
domain4.com
domain5.com
# cat xx02
domain6.com
domain7.com
domain8.com
您可以使用查看此工具的手冊頁 man csplit
以獲取有關此的更多信息。
另請參閱 : 如何在 Linux 中使用截斷命令
包起來
Linux 用戶可能不需要每天使用這些命令行實用程序,但這是重要的實用程序之一,它將對您的服務器管理有所幫助。 我希望這篇文章解釋了這些工具的所有基本選項和用途。 請就此發表您的寶貴意見和建議。