dd、split、csplit命令

来源:http://www.cnblogs.com/f-ck-need-u/archive/2017/08/30/7454671.html
-Advertisement-
Play Games

本文目錄: 1.1 dd命令 1.2 split命令 1.3 csplit命令 在Linux最常用的文件生成和切片工具是dd,它功能比較全面,但無法以行為單位提取文件數據,也無法直接將文件按大小或行數進行均分(除非藉助迴圈)。另兩款數據分割工具split和csplit能夠比較輕鬆地實現這些需求。cs ...



本文目錄:

1.1 dd命令

1.2 split命令

1.3 csplit命令


在Linux最常用的文件生成和切片工具是dd,它功能比較全面,但無法以行為單位提取文件數據,也無法直接將文件按大小或行數進行均分(除非藉助迴圈)。另兩款數據分割工具split和csplit能夠比較輕鬆地實現這些需求。csplit是split的升級版。

1.1 dd命令

從if指定的文件讀取數據,寫入到of指定的文件。使用bs指定讀取和寫入的塊大小,使用count指定讀取和寫入的數據塊數量,bs和count相乘就是文件總大小。可以指定skip忽略讀取if指定文件的前多少個塊,seek指定寫入到of指定文件時忽略前多少個塊。

dd if=/dev/zero of=/tmp/abc.1 bs=1M count=20

if是input file,of是output file;bs有c(1byte)、w(2bytes)、b(512bytes)、kB(1000bytes)、K(1024bytes)、MB(1000)、M(1024)和GB、G等幾種單位。因此,不要隨意在單位後加上字母B。

假設現有文件CentOS.iso的大小1.3G,需要將其切分後還原,切分的第一個小文件大小為500M。

dd if=/tmp/CentOS.iso of=/tmp/CentOS1.iso bs=2M count=250

生成第二個小文件,由於第二個小文件不知道具體大小,所以不指定count選項。由於第二個小文件要從第500M處開始切分,於是需要忽略CentOS.iso的前500M。假設bs=2M,於是skip掉的數據塊數量為250。

dd if=/tmp/CentOS.iso of=/tmp/CentOS2.iso bs=2M skip=250

現在CentOS.iso=CentOS1.iso+CentOS2.iso。可以將CentOS[1-2].iso還原。

cat CentOS1.iso CentOS2.iso >CentOS_m.iso

比較CentOS_m.iso和CentOS.iso的md5值,它們是完全一樣的。

shell> md5sum CentOS_m.iso CentOS.iso
504dbef14aed9b5990461f85d9fdc667  CentOS_m.iso
504dbef14aed9b5990461f85d9fdc667  CentOS.iso

那麼seek選項呢?和skip有什麼區別?skip選項是忽略讀取時的前N個數據塊,而seek是忽略寫入文件的前N個數據塊。假如要寫入的文件為a.log,則seek=2時,將從a.log的第3個數據塊開始追加數據,如果a.log文件本身大小就不足2個數據塊,則缺少的部分自動使用/dev/zero填充。

於是,在有了CentOS1.iso的基礎上,要將其還原為和CentOS.iso相同的文件,可以使用下麵的方法:

dd if=/tmp/CentOS.iso of=/tmp/CentOS1.iso bs=2M skip=250 seek=250

還原後,它們的md5值也是相同的。

shell> md5sum CentOS1.iso CentOS.iso
504dbef14aed9b5990461f85d9fdc667  CentOS1.iso
504dbef14aed9b5990461f85d9fdc667  CentOS.iso

1.2 split命令

split工具的功能是將文件切分為多個小文件。既然要生成多個小文件,必然要指定切分文件的單位,支持按行切分以及按文件大小切分,另外還需解決小文件命名的問題。例如,文件名首碼、尾碼。如果未明確指定首碼,則預設的首碼為"x"。

以下是命令的語法說明:

split [OPTION]... [INPUT [PREFIX]]
 
-a N:生成長度為N的尾碼,預設N=2
-b N:每個小文件的N,即按文件大小切分文件。支持K,M,G,T(換算單位1024)或KB,MB,GB(換算單位1000)等,預設單位為位元組
-l N:每個小文件中有N行,即按行切分文件
-d N:指定生成數值格式的尾碼替代預設的字母尾碼,數值從N開始,預設為0。例如兩位長度的尾碼01/02/03
--additional-suffix=string:為每個小文件追加額外的尾碼,例如加上".log"。有些老版本不支持該選項,在CentOS 7.2上已支持。
 
INPUT:指定待切分的輸入文件,如要切分標準輸入,則使用"-"
PREFIX:指定小文件的首碼,如果未指定,則預設為"x"

例如,將/etc/fstab按行切分,每5行切分一次,並指定小文件的首碼為"fs_",尾碼為數值尾碼,且尾碼長度為2。

[root@xuexi ~]# split -l 5 -d -a 2 /etc/fstab fs_

[root@xuexi ~]# ls
fs_00  fs_01  fs_02

查看任一小文件。

[root@xuexi ~]# cat fs_01
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 /                       xfs     defaults        0 0
UUID=367d6a77-033b-4037-bbcb-416705ead095 /boot                   xfs     defaults        0 0

可以將這些切分後的小文件重新組裝還原。例如,將上面的三個小文件還原為~/fstab.bak。

[root@xuexi ~]# cat fs_0[0-2] >~/fstab.bak

還原後,它們的內容是完全一致的。可以使用md5sum比較。

[root@xuexi ~]# md5sum /etc/fstab ~/fstab.bak
29b94c500f484040a675cb4ef81c87bf  /etc/fstab
29b94c500f484040a675cb4ef81c87bf  /root/fstab.bak

還可以將標準輸入的數據進行切分,並分別寫入到小文件中。例如:

[root@xuexi ~]# seq 1 2 15 | split -l 3 -d - new_

[root@xuexi ~]# ls new*
new_00  new_01  new_02

可以為每個小文件追加額外的尾碼。有些老版本的split不支持該選項,而是在csplit上支持的,但是新版本的split已經支持。例如,加上".log"。

[root@xuexi ~]# seq 1 2 20 | split -l 3 -d -a 3 --additional-suffix=".log" - new1_

[root@xuexi ~]# ls new1*
new1_000.log  new1_001.log  new1_002.log  new1_003.log

1.3 csplit命令

split只能按行或按照大小進行切分,無法按段落切分。csplit是split的變體,功能更多,它主要是按指定上下文按段落分割文件。

csplit [OPTION]... FILE PATTERN...
 
描述:按照PATTERN將文件切分為"xx00","xx01", ...,併在標準輸出中輸出每個小文件的位元組數。
 
選項說明:
-b FORMAT:指定文件尾碼格式,格式為printf的格式,預設為%02d。表示尾碼以2位數值,且不足處以0填充。
-f PREFIX:指定首碼,不指定是預設為"xx"-k:用於突發情況。表示即使發生了錯誤,也不刪除已經分割完成的小文件。
-m:明確禁止文件的行去匹配PATTERN。
-s:(silent)不列印小文件的文件大小。
-z:如果切分後的小文件中有空文件,則刪除它們。
 
FILE:待切分的文件,如果要切分標準輸入數據,則使用"-"。
 
PATTERNs:
 
INTEGER         :數值,假如為N,表示拷貝1到N-1行的內容到一個小文件中,其餘內容到另一個小文件中。
/REGEXP/[OFFSET]:從匹配到的行開始按照偏移量拷貝指定行數的內容到小文件中。
                :其中OFFSET的格式為"+N""-N",表示向後和向前拷貝N行
%REGEXP%[OFFSET]:匹配到的行被忽略。
{INTEGER}       :假如值為N,表示重覆N此前一個模式匹配。
{*}             :表示一直匹配到文件結尾才停止匹配。

假設文件內容如下:

[root@xuexi ~]# cat test.txt
SERVER-1
[connection] 192.168.0.1 success
[connection] 192.168.0.2 failed
[disconnect] 192.168.0.3 pending
[connection] 192.168.0.4 success
SERVER-2
[connection] 192.168.0.1 failed
[connection] 192.168.0.2 failed
[disconnect] 192.168.0.3 success
[CONNECTION] 192.168.0.4 pending
SERVER-3
[connection] 192.168.0.1 pending
[connection] 192.168.0.2 pending
[disconnect] 192.168.0.3 pending
[connection] 192.168.0.4 failed

假設每個SERVER-n表示一個段落,於是要按照段落切分該文件,使用以下語句:

[root@xuexi ~]# csplit -f test_  -b %04d.log test.txt /SERVER/ {*}
0
140
139
140

 "-f test_" 指定小文件首碼為"test_", "-b %04d.log" 指定文件尾碼格式"00xx.log",它自動為每個小文件追加額外的尾碼".log", "/SERVER/" 表示匹配的模式,每匹配到一次,就生成一個小文件,且匹配到的行是該小文件中的內容, "{*}" 表示無限匹配前一個模式即/SERVER/直到文件結尾,假如不知道{*}或指定為{1},將匹配一次成功後就不再匹配。

[root@xuexi ~]# ls test_*
test_0000.log  test_0001.log  test_0002.log  test_0003.log

上面的文件中雖然只有三個段落:SERVER-1,SERVER-2,SERVER-3,但切分的結果生成了4個小文件,並且註意到第一個小文件大小為0位元組。為什麼會如此?因為在模式匹配的時候,每匹配到一行,這一行就作為下一個小文件的起始行。由於此文件第一行"SERVER-1"就被/SERVER/匹配到了,因此這一行是作為下一個小文件的內容,在此小文件之前還自動生成一個空文件。

生成的空文件可以使用"-z"選項來刪除。

[root@xuexi ~]# csplit -f test1_ -z -b %04d.log test.txt /SERVER/ {*}
140
139
140

還可以指定只拷貝匹配到的行偏移數量。例如,匹配到行時,只拷貝它後面的1行(包括它自身共兩行),但多餘的行將放入下一個小文件中。

[root@xuexi ~]# csplit -f test2_ -z -b %04d.log test.txt /SERVER/+2 {*}
42
139
140
98

第一個小文件只有兩行。

[root@xuexi ~]# cat test2_0000.log 
SERVER-1
[connection] 192.168.0.1 success

SERVER-1段落的其餘內容放入到了第二個小文件中。

[root@xuexi ~]# cat test2_0001.log
[connection] 192.168.0.2 failed
[disconnect] 192.168.0.3 pending
[connection] 192.168.0.4 success
SERVER-2
[connection] 192.168.0.1 failed

同理第三個小文件也一樣,直到最後一個小文件中存放剩餘所有無法匹配的內容。

[root@xuexi ~]# cat test2_0003.log 
[connection] 192.168.0.2 pending
[disconnect] 192.168.0.3 pending
[connection] 192.168.0.4 failed

指定"-s"或"-q"選項以靜默模式運行,將不會輸出小文件的大小信息。

[root@xuexi ~]# csplit -q -f test3_ -z -b %04d.log test.txt /SERVER/+2 {*}

回到系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7048359.html

轉載請註明出處:http://www.cnblogs.com/f-ck-need-u/p/7454671.html

註:若您覺得這篇文章還不錯請點擊下右下角的推薦,有了您的支持才能激發作者更大的寫作熱情,非常感謝!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原地址:http://www.cnblogs.com/shootercheng/p/5836657.html 1.查看資料庫編碼格式 mysql> show variables like 'character_set_database'; 2.查看數據表的編碼格式 mysql> show creat ...
  • 給mongo配置文件坑了好久,今天終於解決了。寫個博客,慶祝一下。 mongo3.4 版本,我是用YAML格式的配置文件。 一開始,配置之後,啟動服務的時候,老是提示:“unrecognized option: systemLog ” (如下圖) 很奇怪的事,它總是提示配置文件的第五行出錯,如下圖, ...
  • 背景 最近越來越多的公司把業務搬遷到雲上,公司也有這個計劃,自己抽時間在阿裡雲和Azure上做了一些小的嘗試,現在把阿裡雲上部署ES和kibana記錄下來。為以後做一個參考,也希望對其他人有幫助。 這裡以阿裡雲為例,由於測試只有一臺機器所以這裡就展開到集群了,下麵介紹下詳細的步驟。 步驟: 1.申請 ...
  • 第一次在博客園寫博客,也算是一個新的開始吧。閑話少說! 筆者之前推行OA系統的時候,管理員賬號一開始設的是admin,用了一段時間之後為了規範統一要改為ADMIN。 那問題來了,除了用戶表之外,還有哪些表哪些欄位的內容,已經記錄了admin呢? 上網查了表及欄位的相關知識之後,加上游標整庫搜索,終於 ...
  • SQL Server 使用兩個內部數據結構跟蹤被大容量複製操作修改的區,以及自上次完整備份後修改的區。這些數據結構極大地加快了差異備份的速度。當資料庫使用大容量日誌恢復模式時,這些數據結構也可以加快將大容量複製操作記錄至日誌的速度。與全局分配圖 (GAM) 和共用全局分配圖 (SGAM) 頁相同,這 ...
  • 摘要: 作為對垃圾游戲時代的致敬, Andreas Streichhardt 使用ArangoDB 資料庫創建了一個Flash 游戲來紀念這個時代。快來看看吧! ...
  • 版本: 主機:Windows 7 64位旗艦版 VMWare 10 + Windows 7 64位旗艦版 VMWare 10 + Ubuntu16.04LTS 64位 文件夾共用【Windows】: 註:先安裝VMWare Tools(如下拖拽(複製粘貼)【Windows】) 1)虛擬機採用橋接的網 ...
  • 好煩,又要寫摘要,主要是自己不會說些違心的話,又不願意發惱騷,但還是記錄一下自己目前的狀態和心情吧。生活內容很豐富但實際很平淡,除了親人帶給我一些驚喜外,我嗅不到任何新鮮了。我不知道自己價值多大,被認可的價值有多大,但我不能發惱騷,畢竟我是一個有內涵的程式猿。於是我想,是我不夠全面不夠自信不夠勇敢吧 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...