『壹』 【深入淺出linux】關於mmap的解析
看這篇文章之前需要知道一個概念
虛擬內存系統通過將虛擬內存分割為稱作虛擬頁(Virtual Page,VP)大小固定的塊,一般情況下,每個虛擬頁的大小默認是4096位元組。同樣的,物理內存也被分割為物理頁(Physical Page,PP),也為4096位元組。
在LINUX中我們可以使用mmap用來在進程虛擬內存地址空間中分配地址空間,創建和物理內存的映射關系。
映射關系可以分為兩種
1、文件映射
磁碟文件映射進程的虛擬地址空間,使用文件內容初始化物理內存。
2、匿名映射
初始化全為0的內存空間。
而對於映射關系是否共享又分為
1、私有映射(MAP_PRIVATE)
多進程間數據共享,修改不反應到磁碟實際文件,是一個-on-write(寫時復制)的映射方式。
2、共享映射(MAP_SHARED)
多進程間數據共享,修改反應到磁碟實際文件中。
因此總結起來有4種組合
1、私有文件映射
多個進程使用同樣的物理內存頁進行初始化,但是各個進程對內存文件的修改不會共享,也不會反應到物理文件中
2、私有匿名映射
mmap會創建一個新的映射,各個進程不共享,這種使用主要用於分配內存(malloc分配大內存會調用mmap)。
例如開辟新進程時,會為每個進程分配虛擬的地址空間,這些虛擬地址映射的物理內存空間各個進程間讀的時候共享,寫的時候會-on-write。
3、共享文件映射
多個進程通過虛擬內存技術共享同樣的物理內存空間,對內存文件 的修改會反應到實際物理文件中,他也是進程間通信(IPC)的一種機制。
4、共享匿名映射
這種機制在進行fork的時候不會採用寫時復制,父子進程完全共享同樣的物理內存頁,這也就實現了父子進程通信(IPC).
這里值得注意的是,mmap只是在虛擬內存分配了地址空間,只有在第一次訪問虛擬內存的時候才分配物理內存。
在mmap之後,並沒有在將文件內容載入到物理頁上,只上在虛擬內存中分配了地址空間。當進程在訪問這段地址時,通過查找頁表,發現虛擬內存對應的頁沒有在物理內存中緩存,則產生"缺頁",由內核的缺頁異常處理程序處理,將文件對應內容,以頁為單位(4096)載入到物理內存,注意是只載入缺頁,但也會受操作系統一些調度策略影響,載入的比所需的多。
1.write
因為物理內存是有限的,mmap在寫入數據超過物理內存時,操作系統會進行頁置換,根據淘汰演算法,將需要淘汰的頁置換成所需的新頁,所以mmap對應的內存是可以被淘汰的(若內存頁是"臟"的,則操作系統會先將數據回寫磁碟再淘汰)。這樣,就算mmap的數據遠大於物理內存,操作系統也能很好地處理,不會產生功能上的問題。
2.read
從圖中可以看出,mmap要比普通的read系統調用少了一次的過程。因為read調用,進程是無法直接訪問kernel space的,所以在read系統調用返回前,內核需要將數據從內核復制到進程指定的buffer。但mmap之後,進程可以直接訪問mmap的數據(page cache)。
測試結果來源於: 深入剖析mmap-從三個關鍵問題說起
1.讀性能分析
場景:對2G的文件進行順序寫入
可以看到mmap在100byte寫入時已經基本達到最大寫入性能,而write調用需要在4096(也就是一個page size)時,才能達到最大寫入性能。
從測試結果可以看出,在寫小數據時,mmap會比write調用快,但在寫大數據時,反而沒那麼快。
2.寫性能分析
場景:對2G的文件進行順序讀取(為了避免磁碟對測試的影響,2G文件都緩存在pagecache中)
由上可以看出,在read上面,mmap的性能還是非常好的。
優點如下:
1、對文件的讀取操作跨過了頁緩存,減少了數據的拷貝次數,用內存讀寫取代I/O讀寫,提高了文件讀取效率。
2、實現了用戶空間和內核空間的高效交互方式。兩空間的各自修改操作可以直接反映在映射的區域內,從而被對方空間及時捕捉。
3、提供進程間共享內存及相互通信的方式。不管是父子進程還是無親緣關系的進程,都可以將自身用戶空間映射到同一個文件或匿名映射到同一片區域。從而通過各自對映射區域的改動,達到進程間通信和進程間共享的目的。同時,如果進程A和進程B都映射了區域C,當A第一次讀取C時通過缺頁從磁碟復制文件頁到內存中;但當B再讀C的相同頁面時,雖然也會產生缺頁異常,但是不再需要從磁碟中復制文件過來,而可直接使用已經保存在內存中的文件數據。
4、可用於實現高效的大規模數據傳輸。內存空間不足,是制約大數據操作的一個方面,解決方案往往是藉助硬碟空間協助操作,補充內存的不足。但是進一步會造成大量的文件I/O操作,極大影響效率。這個問題可以通過mmap映射很好的解決。換句話說,但凡是需要用磁碟空間代替內存的時候,mmap都可以發揮其功效。
缺點如下:
1.文件如果很小,是小於4096位元組的,比如10位元組,由於內存的最小粒度是頁,而進程虛擬地址空間和內存的映射也是以頁為單位。雖然被映射的文件只有10位元組,但是對應到進程虛擬地址區域的大小需要滿足整頁大小,因此mmap函數執行後,實際映射到虛擬內存區域的是4096個位元組,11~4096的位元組部分用零填充。因此如果連續mmap小文件,會浪費內存空間。
3.如果更新文件的操作很多,會觸發大量的臟頁回寫及由此引發的隨機IO上。所以在隨機寫很多的情況下,mmap方式在效率上不一定會比帶緩沖區的一般寫快。
『貳』 Linux文件管理基礎及編輯工具用法
文件名稱區分大小寫
文件名最長255個字元
包括路徑在內文件名稱最長4095個位元組
藍色-->目錄:綠色-->可執行文件:紅色-->壓縮文件:淺藍色-->鏈接文件:灰色-->其它文件
除了斜杠和NUL,所有字元都有效,使用特殊字元的目錄名和文件不推薦使用,有些字元需要加引號來引用
標准Linux文件系統,文件名稱大小寫敏感
/boot: 內核引導文件存放目錄
/bin: 所有用戶使用的基本命令;不能關聯至獨立分區,系統啟動會用到的程序
/sbin: 管理類的基本命令;不能關聯至獨立分區,系統啟動會用到的程序
/lib: 系統啟動時程序依賴的基本共享庫文件及內核模塊文件(/lib/moles)
/etc: 配置文件目錄
/home: 普通用戶家目錄
/root: 管理員家目錄
/media: 攜帶型移動設備掛載點
/mnt: 臨時文件系統掛載點
/dev: 設備文件及特殊文件存儲位置
/opt: 第三方應用程序安裝位置,同/usr/local
/srv: 系統服務用到的數據
/tmp: 存儲臨時文件
/usr: 系統軟體資源存放目錄
/var: 系統運行時的可變動數據:/var/tmp:系統兩次重啟產生的臨時數據
/proc: 內核與進程信息相關的虛擬文件系統
/sys: 硬體設備相關信息的虛擬文件系統
/selinux: selinux安全策略
meta data:
文件類型,許可權,UID,GID
鏈接數(指向這個文件名路徑名稱個數)
該文件的大小和不同的時間戳
指向磁碟上文件的數據塊指針
有關文件的其他數據
文件類型:
-: 普通文件
d: 目錄文件
b: 塊設備
c: 字元設備
l: 符號鏈接文件
p: 管道文件pipe
s: 套接字文件socket
查看方式:
使用ll,ls -l: 看第一個字元,鏈接數,
ls -lih:
inode編號,文件類型,文件許可權,硬鏈接個數,文件屬主,文件屬組,文件大小,文件修改時間
file命令,type命令,
stat命令: 文件詳細信息,修改時間mtime,改變時間ctime,訪問時間atime
-sm filename: 查看文件大小
文件擴展名:
源碼.tar、.tar.gz、.tgz、.zip、.tar.bz表示壓縮文件,創建命令一般為tar,gzip,zip等。
.sh表示shell腳本文件,通過shell語言開發的程序。
.pl表示perl語言文件,通過perl語言開發的程序。
.py表示python語言文件,通過python語言開發的程序。
.html、.htm、.php、.jsp、.do表示網頁語言的文件。
.conf表示系統服務的配置文件。
.rpm表示rpm安裝包文件。
touch: 創建空文件和刷新時間戳
touch [OPTION]... FILE...
-a: 改變atime和ctime
-m: 改變mtime和ctime
-t: [[CC[YY[MMDDhhmm[.ss]]]]]
指定atime和mtime的時間戳
-c: 如果文件不存在,則不予創建
硬鏈接:
同一個文件多個名字
不支持跨分區,不支持目錄
平級關系,刪除原始文件不影響打開
iNode相同,鏈接數增長
創建語法,原始文件路徑,相對於工作目錄的路徑
文件類型,普通文件
創建方式ln filename [linkname]
軟鏈接:
與原始文件,不同的文件
支持跨分區,支持目錄
依賴關系,刪除原始文件即失效
iNode不同,鏈接數不會增長
創建語法,原始文件路徑,相對於軟鏈接的路徑
文件類型顯示l
創建方式ln -s filename [linkname]
實例說明:
cd ../data
mkdir -pv d1/d2
touch linux.txt
ln linux.txt d1/d2/linux.hlink
ln -s ../../linux.txt d1/d2/linux.slink
ln -s ../d2 d1/d2/d2.slink
tree
執行如圖:
stat: 查看文件狀態
示例: stat /etc/issue
stat/etc/motd
touch: 創建空文件和刷新時間
touch [OPTION]... FILE...
-a: 僅改變atime和ctime
-m: 僅改變mtime和ctime
-t: 指定atime和mtime時間戳
-c: 如果文件不存在,則不予創建
示例: touch /data/f1
cp: 復制文件和目錄
cp [OPTION]... SOURCE... DIRECTORY
-i: 覆蓋前提示
-n: 不覆蓋
-r,-R: 遞歸復制目錄及內部的所有內容
-a: 歸檔,相當於-dR --preserv=all
-p: 等同--preserv=mode,ownership,timestamp
-u: 只復制源比目標更新或目標不存在
-b: 目標存在,覆蓋前先備份filename~
--backup=numbered: 目標存在,覆蓋前先備份並加數字後綴
cp SRC DEST
SRC是文件:
如果目標不存在: 新建DEST,並將SRC中內容填充至DEST中
如果目標存在:
如果DEST是文件: 將SRC中內容覆蓋至DEST中
如果DEST是目錄: 在DEST下新建與原文件同名的文件,並將SRC中內容填充至新文件中
SRC是多個文件:
DEST必須存在,且為目錄
SRC是目錄: 使用選項-r
如果DEST不存在: 則創建指定目錄,復制SRC目錄中所有文件至DEST中
如果DEST存在:
如果DEST是文件: 報錯
如果DEST是目錄:在DEST下新建與原目錄同名的目錄,並將SRC中內容復制至新目錄中
示例: mkdir -p /data/backup
cp -ab /etc/issue /etc/passwd /etc/group /data/backup
mv: 移動和重命名文件
mv [OPTION]... SOURCE... DIRECTORY
-f: 強制
-b: 目標存在,覆蓋前先備份
示例: mv /etc/issue /data
mv /etc/issue /data/issue.bak
rm: 刪除
rm [OPTION]... FILE...
-f: 強制刪除
-r: 遞歸
--no-preserve-root 刪除/
示例: rm -rf /data/d1/d2
tree: 顯示目錄樹
-d:只顯示目錄
-L level: 指定顯示的層級數目
-P pattern: 只顯示由指定pattern匹配到的路徑
示例: tree /data
ls:列出指定目錄下的內容
ls [OPTION]... [FILE]...
-a:顯示所有文件包括隱藏文件
-A:顯示除.和..之外的所有文件
-l,--long:顯示文件的詳細屬性信息
-h:對文件大小進行單位換算,可能影響精度
-d:查看目錄本身而非其內部的文件
-r:逆序顯示文件
-R:遞歸顯示文件
示例:ls -lah / 詳細顯示/目錄下的所有文件(包括隱藏文件)
mkdir:創建目錄
mkdir [OPTION]... DIRECTORY...
-p:自動按需創建父目錄
-m:創建目錄時給定許可權
示例: mkdir -p /data/test/A/B
cat:正向查看文本內容
cat [OPTION]... [FILE]...
-n:給顯示的文本行編號
-E:顯示行結束符號$
示例: cat -n /etc/fstab
tail:顯示文本內容,默認顯示後10行
tail [OPTION]... [FILE]...
-n #:顯示文本後#行內容
-f:查看文件尾部內容結束後不退出,跟隨顯示新增的行
示例: tail -8 /etc/passwd
head:顯示文本內容,默認顯示頭10行
head [OPTION]... [FILE]...
-n #:顯示文本頭#行內容
示例: head -5 /etc/passwd
less:分屏顯示文本內容,不主動退出
less [options] file [...]
Space鍵:顯示文本下一屏內容
Enter鍵:只顯示文本下一行內容
b鍵:顯示文本上一屏內容
q鍵:退出
cp /etc/profile /tmp
vim /tmp/profile
:%s/^\s\+//
如圖:
命令模式下輸入:
:set tabstop=4
或寫入用戶配置文件~/.vimrc
『叄』 linux下怎樣將一個文件填充為0xff,用命令
以下程序可以填充文件後面全部為0xff到指定大小.
test.c
#include <stdio.h>
/*
* Return: 0, OK
* -1, Fail
*/
unsigned long int appendFile(char *destFilePath, unsigned long int appendLength)
{
unsigned char tmpBuf[1024];
int i = 0;
FILE *fp;
for(i = 0; i < 1024; i++)
{
tmpBuf[i] = 0xFF;
}
if ((fp = fopen(destFilePath, "ab+"))==NULL)
{
printf("Can not open file %s \n", destFilePath);
return -1;
}
while(appendLength > 0)
{
if (appendLength <= 1024)
{
fwrite(tmpBuf, sizeof(char), appendLength, fp);
appendLength -= appendLength;
}
else
{
fwrite(tmpBuf, sizeof(char), 1024, fp);
appendLength -= 1024;
}
}
fclose(fp);
return 0;
}
#define SRC_FILE "./file1.bin"
#define DEST_FILE "./file2.bin"
void main(void)
{
unsigned long int totalLength = (85504 - 13824) * 1024;
unsigned long int fileLength = 57751552;
unsigned long int appendLength = totalLength - fileLength;
appendFile(DEST_FILE, appendLength);
}
『肆』 Linux 文件&目錄相關命令簡介
此處要介紹的相關命令共有29個
關於文件與目錄管理的命令有9個,分別是 cd 、 ls 、 pwd 、 mkdir 、 rmdir 、 cp 、 rm 、 mv 、 touch
關於文件與目錄許可權的命令有6個,分別是 chown 、 chgrp 、 chmod 、 umask 、 chattr 、 lsattr
關於文件查看與尋找的命令有14個,分別是 cat 、 tac 、 nl 、 more 、 less 、 head 、 tail 、 od 、 which 、 whereis 、 locate 、 find 、 file 、 updatedb
在linux中,有5個特殊目錄:
在 ls -l 命令的輸出內容中,顯示出每一個文件或目錄的一些常見屬性,例如:
在上述的屬性中,第一欄 drwxr-xr-x 為該文件的許可權欄,該塊共有10個字元組成。其中第一個字元顯示該文件的類型,共有7種文件類型:
其餘9個字元分為三組,第一組代表文件擁有者的許可權,第二組代表文件擁有組的許可權,第三組代表其他用戶的許可權
三組中每組又有三個字元,分別代表這 rwx 許可權,也就是讀,寫,執行許可權。當許可權不存在時,系統會以 - 填充該位。
SUID
該許可權僅作用於文件,主要用途是讓使用者臨時擁有文件所有者的許可權,僅對可執行的二進制文件有用,對腳本無效,在文件所有者的x許可權上生效,存在時x許可權變為小寫s,當x許可權本身不存在時,顯示大寫S
SGID
當該許可權作用在文件上時,主要用於是讓使用者擁有該文件群組的許可權;如果該許可權作用在目錄上時,主要是讓新建的文件或者目錄的所屬組為當前目錄的所屬組,在文件群組的x許可權上生效,存在時x許可權變為小寫s,當x許可權本身不存在時,顯示大寫S
作用於文件
作用於目錄
SBIT
該許可權僅作用於目錄,主要用途是讓使用者在該目錄創建了新文件或目錄時,僅有該使用者或root才有權利刪除該文件,在文件其他用戶的x許可權上生效,存在時x許可權變為小寫t,當x許可權本身不存在時,顯示大寫T
以上三個特殊許可權的配置與一般許可權配置類似,只不過在需要配置特殊許可權時,chmod後跟四位許可權信息即可(需要注意的是,在配置特殊許可權時要保證對應的位置上有x許可權,否則將會顯示大寫的字母來標識無效)
一、讓使用者能進入某目錄成為『可工作目錄』的基本許可權為何?
二、使用者在某個目錄內讀取一個文件的基本許可權為何?
三、讓使用者可以修改一個文件的基本許可權為何?
四、讓一個使用者可以創建一個文件的基本許可權為何?
五、讓使用者進入某目錄並運行該目錄下的某個命令之基本許可權為何?
『伍』 linux內核發包時mac層是什麼時候填充的
在內抄核態能夠直接操作的地址一定必須是0xc0000000-0xffffffff之間的,這個范圍之外的地址都會發生缺頁異常,要訪問用戶態的地址空間的話,只能先將用戶地址空間轉換到內核地址空間; 用戶空間地址-》物理地址-》內核空間地址-》操作
比如在內核態要將0x08048100處的賦值10;
先通過0x08048100查頁表得到其物理地址A,
如果A<896M,那麼就 *(0xc000_0000+A)=10;
如果A>896M(高端內存),就需要通過內核動態映射區將物理地址A映射到內核地址空間B,然後*B=10;
B的值在范圍(0xc0000000+896M,0xffffffff)之間;
『陸』 python填充linux內存80%
1、使用兩個Python腳本文件,分別是test.py和mem_rate.py。
2、其功能分別是查看當前內存佔用和動態設定內存佔用百分比。即可將Linux內存填充80%。
『柒』 Linux文件系統操作命令
Linux文件系統操作命令大全
Linux命令有很多,那麼Linux文件系統操作命令又有哪些呢?下面我為你介紹!
文件系統操作命令:
1. cat:可以顯示文件的內容(經常和more搭配使用),或將多個文件合並成一個文件。
2. chgrp:用來改變文件或目錄所屬的用戶組,命令的參數以空格分開的要改變屬組的文件列表,文件名支持通配符,如果用戶不是該文件的所有者,則不能改變該文件的所屬組。
3. chmod:用於改變文件或目錄的訪問許可權,該命令有兩種用法:一種是使用圖形化的方法,另一種是數字設置法。
4. chown:用來將指定用戶或組為特定的所有者。用戶可以設置為用戶名或用戶ID,組可以是組名或組ID。特定的文件是以空格分開的可以改變許可權的文件列表,文件名支持通配符。
5. clear:用來清除終端屏幕。
6. cmp:用來比較兩個文件的大小。
7. cp:()可以將文件或目錄復制到其他目錄中,就如同Dos下的命令一樣,功能非常強大。在使用cp命令時,只需要指定源文件名或目標目錄即可。
8. cut:用來移除文件的部分內容。
9. diff:用來找出兩個文件的不同之處。
10. : 用來顯示磁碟的剩餘空間的大小。
11. file:用來顯示文件的類型。
12. find:用來在目錄中搜索文件,並執行指定的操作。
13. head:只查看文件的頭幾行內容,而不必瀏覽整個文件。
14. ln:可以在文件之間創建鏈接,實際上是給某個文件指定一個訪問它的別名。
15. less:用法與more類似,可以查看超過一屏的文件內容,不同的是less除了可以按空格鍵向下顯示文件外,還可以利用方向鍵來滾動顯示文件,要結束瀏覽,只要在less的提示符“:”後按Q即可。
16. locate:可用於查找文件,且比find命令的搜索速度快。
17. ls(list):用來顯示當前目錄中的文件和子目錄列表。
18. mkdir(make directory):建立子目錄。
19. more:用於顯示內容超過一屏的文件,為了避免文件內容顯示瞬間就消失,可以使用more命令讓文件顯示滿一屏時暫停,在按下任意鍵的時候繼續顯示下一屏的內容。
20. rmkdir(remove directory):用來刪除“空”的子目錄或無用的目錄文件。
21. mv(move):可以將文件以及目錄移到其他位置,或更改文件以及目錄的名稱。
22. pico:可指定文本的編輯方式。
23. pwd(print working directory):可顯示用戶當前所在的目錄。
24. rm:用來刪除系統中過時或無用的文件,可以刪除目錄中的文件或目錄本身,對於鏈接文件,原有文件保持不變。
25. sort:將文本文件自動分類。
26. stat:用於顯示文件或文件系統的狀態。
27. Strings:顯示文件中要列印的字元串。
28. tail:輸出文件的結尾。
29. touch:改變文件的時間戳。
30. umask:用於啟動bash shell。
31. uniq:移除已分類文件中的重復文本行。
32. vi:啟動vi文本編輯器。
33. wc:顯示文件中位元組、片語合文本行的數目。
34. whereis:查找特定目錄下的原始程序,二進製程序或用戶手冊等文件的位置。
35. man:如果用戶對某個命令想了解更詳細的話,可使用此命令。
36. dd:復制一個文件。
37. df:查看一個文件系統的磁碟空間使用情況。
38. edquoat:設置用戶與用戶組的磁碟空間限制,即Windows系統中的配額。
39. fdformat:格式化軟盤。
40. fdisk:執行Linux下的`磁碟分區。
41. mkfs:建立一個Linux文件系統。
42. mkswap:創建一個Linux交換分區。
43. mount:掛載一個文件系統。
44. quota:限制和顯示用戶可用的磁碟空間。
45. swapon,swapoff:啟用或取消設備和文件的交換頁。
46. quotaon,quotaoff:啟用或取消quota限制。
47. umount:取消文件系統的裝備。
系統管理命令
1. finger:查詢用戶信息,也能查看默認的用戶環境。
2. ftp:標準的文件傳輸協議的用戶介面,是在網路上傳輸文件最簡單有效的方法。
3. host:用於DNS查詢。
4. hostname:用於顯示或設置系統的主機名。
5. ifconfig:用於配置網卡介面。(可以使用down或up參數來禁用或啟用某個網卡介面)
6. mail:發送和接收郵件。
7. netstat:顯示網路連接、路由表和網路介面信息,用戶可以知道目前那些網路連接正在運行。
8. ping:此命令用於測試本計算機和網路上其它的計算機是否相連。
9. rlogin:遠程登陸命令,該命令與telnet命令很相似,允許用戶啟動遠程系統的交互會話。
10. rcp:rcp(remote file )命令是遠程文件復制命令,該命令用於在計算機之間復制文件,有兩中格式,一種格式用於文件動文件的復制,另一種用於把文件或目錄復制到其他文件目錄中。
11. route:此命令用於顯示或設置IP路由表。
12. tcpmp:此命令用於測試網路的通信量。
13. talk:此命令可用於事項網路用戶的適時交談,但是必須將雙方系統的信息加入各自的/etc/hosts文件中,以相互識別。
14. telnet:此命令用於通過網路登陸遠程計算機,如同操作本地計算機一樣。
15. wall:wall(write all)命令可以用於發送消息給登陸本機的用戶。在發送消息時,可直接輸入要發送的消息,也可以把文件當成消息發送。
16. wget:此命令用於Linux環境下從Internet上下載文件,支持http和ftp協議,支持代理伺服器和斷點連續傳功能,能夠遞歸遠程主機上的目錄,查找合乎要求的的文件並下載到本地硬碟上。Wget命令可以在後台運行,截獲並忽略hantfup信號,因此用戶退出登陸後,仍可繼續運行。
17. &,bg:&,bg命令是後台執行命令,有時候用戶執行的程序可能要話很多時間,如果放在前台執行,可能無法繼續其他操作,最好將他放在後台執行。
18. fg:fg命令是前台執行命令,如果用戶有程序在後台運行,可以通過fg命令將程序從後台移到前台執行。
19. jobs:此命令用於顯示正在後台執行的任務清單。Bg,fg,jobs命令都屬於bash命令,
20. kill:此命令用於終止一個程序,例如:#[root@rathat9 root]kill 3793
21. ps:此命令用於顯示程序的狀態。
22. top:此命令用於顯示當前CPU進程。
23. at batch atp atrm:這些命令用於排序,檢查或刪除後台運行的任務。
Linux與用戶有關的命令:
1. passwd命令:更改用戶口令。
格式:passwd [用戶名]
2. su命令:可以讓一個普通用戶擁有超級用戶或其他用戶的許可權,也可以讓超級擁護以普通用戶的身份做一些事情。
格式:su[選項][?][使用者賬號]
說明:若沒有指定的使用者賬號,則系統預設值為超級用戶root。該命令中個選項的含義分別為:
-c:執行一個命令後就結束。
-:加了這個減號的目的是使環境變數和欲轉換的用戶相同。
-m:保留環境變數不變。
Linux系統管理命令:
1. wall命令:對全部以登陸的用戶發送信息。
2. write命令:向系統中某一用戶發送信息。
格式:write 用戶賬號 [終端名稱]
3. mesg命令:設定是否允許其他用戶用write命令給自己發送信息。
如果允許輸入命令:mesg y
如果不允許輸入命令:mesg n
4. sync命令:在關閉Linux系統是使用的。Sync是強制把內存中的數據寫回硬碟,以免數據丟失。
5. shutdown命令:可以安全的關閉或重啟Linux它在系統關閉之前給系統上的所有登陸用戶提示一條警告信息。
格式:shutdown [選項][時間][警告信息]
命令中選項的含義:
-k:並不真正關機,而只是發出警告信息給所有用戶。
-r:關機後立即重新啟動。
-h:關機後不重新啟動。
-f快速關機,重新啟動時跳過fsck。
-n:快速關機,不經過init程序。
-c:取消一個已經運行的shutdown。
6. free命令:查看當前系統內存的使用情況,它顯示系統中剩餘及已用的物理內存和交換內存,以及共享內存和被核心使用的緩沖區。
格式:free [-b | -k |-m]
命令中各個選項的含義:
-b:以位元組為單位顯示。
-k:以K位元組為單位顯示。
-m:以兆位元組為單位顯示。
7. uptime命令:顯示系統已經運行了多長時間,它依次顯示下列信息:現在時間、系統已經運行了多長時間、目前有多少登陸用戶、系統在過去的1分鍾、5分鍾和15分鍾內的平均負載。
8. df命令:檢查文件系統的磁碟空間佔用情況。
格式:df [選項]
說明:df命令可顯示所有文件系統對I節點和磁碟塊的使用情況。
命令中各個選項的含義:
-a:顯示所有文件系統的磁碟使用情況,包括0塊(block)的文件系統。
-k:以k位元組為單位顯示。
-i:顯示i節點信息,而不是磁碟塊。
-t:顯示各指定類型的文件系統的磁碟空間使用情況。
-x:列出不是某一指定類型文件系統的磁碟空間使用情況。
-T:顯示文件系統類型。
9. 命令:顯示磁碟空間的使用情況。統計目錄(或文件)所佔磁碟的大小。
格式: [選項] [Names…]
說明:該命令逐級進入指定目錄的每一個子目錄並顯示該目錄佔用文件系統數據塊(1024位元組)的情況。若沒有給出Names,則對當前目錄進行統計。
命令中各個選項的含義:
-s:對每個Names參數只給出佔用的數據塊總數。
-a:遞歸的顯示指定目錄中各文件及子孫目錄中個文件佔用的數據塊數。若既不指定-s,也不指定-a,則顯示Names中的每一個目錄及其中的各子目錄所佔的磁碟塊數。
-b:以位元組為單位列出磁碟空間使用情況(系統預設以k位元組為單位)。
-k:以1024位元組為單位列出磁碟空間的使用情況。
-c:最後再加上一個總計(系統預設設置)。
-l:計算所有的文件大小,對硬鏈接文件,則計算多次。
-x:跳過在不同文件系統上的目錄不予統計。
10. dd命令:把指定的輸入文件拷貝到指定的輸出文件中,並且在拷貝過程中可以進行格式轉換。
格式:dd [選項]
命令中各個選項的含義:
if = 輸入文件(或設備名稱)。
of = 輸出文件(或設備名稱)。
ibs = bytes 一次讀取bytes位元組,及讀入緩沖區的位元組數。
skip = blocks 跳過讀入緩沖區開頭的ibs*blocks塊。
obs = bytes 一次寫入bytes位元組,及寫入緩沖區的位元組數。
bs = bytes 同時設置讀/寫緩沖區的位元組數(等於設置ibs和obs).
cbs = byte 一次轉換bytes位元組。
count = blocks 只拷貝輸入的block塊。
conv = ASCⅡ 把EBCDIC碼轉換為ASCⅡ。
conv = ebcdic 把ASCⅡ碼轉換為EBCDIC碼。
conv = ibm ibm把ASCⅡ碼轉換為alternate EBCDIC碼。
conv = block 把變動位轉換成固定字元。
conv = ublock 把固定位轉換成變動位。
conv = ucase 把字母由小寫轉換為大寫。
conv = lcase 把字母由大寫轉換為小寫。
conv = notrunc 不截短輸出文件。
conv = swab 交換每一對輸入位元組。
conv = noerror 出錯是不停止處理。
conv = sync 把每個輸入記錄的大小都調到ibs的大小(用NUL填充)。
11. fdformat命令:低級格式化軟盤。
格式:format [-n] device
說明:-n 軟盤格式化後不作檢驗。
12. echo命令:在顯示器上顯示一段文字,一般起到一個提示作用。
格式:echo [-n] 字元串
13. cal命令:顯示某年某月的日歷。
格式:cal [選項] [月 [年]]
命令中各個選項的含義:
-j:顯示出給定月中的每一天是一年中的第幾天(從1月1日算起)。
-y:顯示出整年的日歷。
14. date命令:顯示和設置系統日期和時間。
格式:date [選項] 顯示時間格式 (以 + 開頭,後面接格式)
date [選項] 設置時間格式
命令中各個選項的含義:
15. clear命令:清除屏幕上的信息。
Vi的基本命令:
1. 移動游標:
Ctrl + b:上滾一屏
Ctrl + f:下滾一屏
Ctrl + d:下滾半屏
Ctrl + u:上滾半屏
G: 移到文件最後
W:移到下個字的開頭
B:跳至上個字的開頭
2. 刪除
x:刪除當前游標所在後面一個字元
#x:刪除當前游標所在後面#個字元。例如,5x表示刪除5個字元。
dd:刪除當前游標所在行
#dd:刪除當前游標所在後面#行。例如,5dd表示刪除字游標算起的5行。
:l,#d:例如,:1,12d表示刪除自行1至行12的文字
X:刪當前游標的左字元
D:刪至行尾
3. 更改
cw:更改游標處的字到此單字的字尾處
c#w:例如,c3w表示更改3個字
cc:修改行
c:替換到行尾
4. 取代
r:取代游標處的字元
R:取代字元直到按ESC為止
5. 復制
yw:拷貝游標處的字到字尾只緩沖區
P:把緩沖區的資料貼上來
yy:拷貝游標所在之行至緩沖區
#yy:例如:5yy,拷貝游標所在之處以下5行至緩沖區
Linux文件的復制,刪除和移動命令
1.cp命令:該命令的功能是將給出的文件或目錄拷貝到另一文件或目錄中,同MSDOS下的COPY命令一樣,功能十分強大。
語法:cp[選項]源文件或目錄,目標文件或目錄
說明該命令把指定的源文件復制到目標文件或把多個源文件復制到目標目錄中。
該命令的各項選項含義如下:
-a:該選項通常在拷貝目錄是使用。他保留鏈接,文件屬性,並遞歸地拷貝目錄,其作用等於dpr選項的組合。
-d:拷貝是保留鏈接
-f:刪除已經存在的目標文件而不提示。
-I:和 f選項相反,在覆蓋目標文件之前將給出提示要求擁護確認。回答y時目標文件將被覆蓋,是互動式拷貝。
-p:此時cp除復制源文件的內容外,還將把其修改時間和反問許可權也復制到新文件中。
-r;若給出的源文件是一目錄文件,此時cp將遞歸復制該目錄下所有的子目錄和文件。此時目標文件必須為一個目錄名。
-L:不作拷貝,只是鏈接文件。
需要說明的是,為防止用戶在不經意的情況下用cp命令破壞另一個文件,如用戶指定的目標文件名已存在,用cp 命令拷貝文件後,這個文件酒會被新源文件覆蓋,因此,建議用戶在使用cp命令拷貝文件時,最好使用I選項。
2.mv命令:用戶可以使用mv命令來為文件或目錄改名或將文件由一個目錄移入另一個目錄中。該命令如同MS-DOS下的ren 和 move 的組合。
語法:mv[選項]源文件或目錄 目標文件或目錄。
說明:視mv命令中第二個參數類型的不同(是目標文件還是目標目錄),mv命令將文件重命名或將其移至一個新的目錄中。當第二個參數類型是文件時,mv命令完成文件重命名,此時,源文件只能有一個(也可以是源目錄名),他將所給的源文件或目錄重命名為給頂的目標文件名。當第二個參數是已存在的目錄名稱時,源文件或目錄參加參數可以有很多個,mv命令將個參數指定的源文件均移至目標目錄中。在跨文件系統移動文件時,mv先拷貝,再將原有文件刪除,而鏈至該文件的鏈接也將丟失。
命令中各選項的含義為:
-I:交互方式操作。如果mv操作將導致對已存在的目標文件的覆蓋,此時系統詢問是否重寫,要求用戶回答y或n,這樣可以避免誤覆蓋文件。
-f:禁止交互操作。在mv操作要覆蓋某已有的目標文件是不給任何指示,指定此選項後,I選項將不再起作用。
如果所給目標文件(不是目錄)已存在,此時該文件的內容將後備新文件覆蓋,為防止用戶用mv命令破壞另一個文件,使用mv命令移動文件時,最好使用I選項。
3.rm命令:用戶可以用rm命令刪除不需要的文件。該命令的功能問刪除一個目錄中的一個或多個文件或目錄,他也可以將某個目錄及其下的所有文件及子目錄均刪除。對於鏈接文件,只是斷開了鏈接,源文件保持不變。
Rm命令的一般形式為:
Rm [選項]文件……
如果沒有使用-r選項,則rm不會刪除目錄。
該命令的各選項含義如下:
-f:忽略不存在的文件,從不給出提示。
-r:指示rm將參數中列出的全部目錄和子目錄均遞歸地刪除。
-I:進行互動式刪除。
使用rm命令要小心。因為一旦文件被刪除,他是不能被恢復的。為了防止這種情況的發生可以使用I選項倆逐個確認要刪除的文件。如果用戶輸入y,文件將被刪除。如果輸入任何其他東西,文件則不會刪除。
Linux目錄的創建與刪除命令:
1. mkdir命令
功能:創建一個目錄(類似MS-DOS下的md命令)。
語法:mkdir[選項]dir-name
說明:該命令創建由dir-name命名的目錄。要求創建目錄的用戶在當前目錄中(dir-name的父目錄中)具有寫許可權,並且dirname不能是當前目錄中已有的目錄或文件名稱。
命令中個選項的含義為:
-m:對新建目錄設置存取許可權。也可以用chmod命令設置。
-p:可以是一個路徑名稱。此時若路徑中的某些目錄尚不存在,加上此選項後,系統將自動建立好那些尚不存在的目錄,即一次可以建立多個目錄。
2. rmdir命令
功能:刪除空目錄。
語法:rmdir[選項]dir-name。/
說明:dir-name表示目錄名。該命令從一個目錄中刪除一個或多個子目錄項。需要特別注意的是,一個目錄被刪除之前必須是空的。Rm-r dir 命令可代替rndir,但是有危險性。刪除某目錄時也必須具有對父目錄的、寫許可權。
命令中個選項的含義為:
-p遞歸刪除目錄dirname,當子目錄刪除後其父目錄為空時,也一同被刪除。如果整個路徑被刪除或者由於某種原因保留部分路徑,則系統在標准輸出上顯示相應的信息。
3. cd命令
功能:改變工作目錄。
語法:cd[directory]
說明:該命令將當前目錄改變至directory所指定的目錄。若沒有指定directory,則回到用戶的主目錄。為了改變到指定目錄,用戶必須擁有對指定目錄的執行和讀許可權。
該命令可以使用通配符(如”*,_”這樣的通配符號)。
4. pwd命令
在Linux層次結構中,用戶可以在被授權的任意目錄下利用mkdir命令創建新目錄,也可以利用cd命令從一個目錄轉換到另一個目錄。然而,沒有提示符來告知用戶目前處於哪一個目錄中。想要知道當前所處的目錄,可以用pwd命令,該命令顯示整個路徑名。
語法:pwd
說明:此命令顯示出當前工作目錄的絕對路徑。
5. ls命令
ls是list的簡寫,其功能為列出目錄的內容。這是擁護最常用的一個命令之一,因為用戶需要不時地查看某個目錄的內容,該命令類似於DOS下的dir命令
語法:ls[選項][目錄或是文件]
對於每個目錄,該命令將列出其中的所有子目錄與文件。對於每個文件,ls將輸出其文件名以及所要求的其他信息。默認情況下,輸出條目按字母順序排序。但未給出目錄名或是文件名時,就顯示當前目錄的信息。
命令中各個選項的含義:
-a:顯示指定目錄下所有子目錄與文件,包括隱藏文件。
-A:顯示指定目錄下所有子目錄與文件,包括隱藏文件。但不列出“.”和“..”.
-b:對文件名中的不可顯示字元用把禁止
linux中所有設備都是以文件的形式顯示
linux下文件的後綴名無實際意義
命令
pwd 顯示路徑
man +命令 列出操作說明
ls -l/-help列出 文件目錄
cd / 目錄做實驗
安裝步驟 configure make make install?
rm -r dl 遞歸刪除目錄
rm -rf 刪除所有目錄
rm -f 加文件名 刪除文件
rmdir +文件地址 刪除文件夾所有和rm -rf功能差不多
touch 加名字 創建新文件
cp 復制 mv 移動 rm 刪除
vi 文本編輯器 輸入a將從命令格式變成輸入格式
head tail 查看前面和後面
find 加位置 加文件名 查找
echo $PATH 查詢路徑
useradd 加名字 添加用戶
userdel 加名字 刪除用戶
su 加用戶名 切換用戶
chmod +x/-x 加文件名 修改文件許可權
chmod 755 加文件名 改變許可權在安裝程序時
grep 加文本字元 加在那個文件 查找字元存在那行
fdisk -l 查看磁碟信息
命令1|命令2|命令三... 管道
ps -ef查看進程
ifconfig linux查看ip
重定向
linux和其它機器之間共享文件vsftp Windows和linux傳輸文件15-17
putty遠程登錄軟體ssh
gzip 壓縮和解壓縮 -d解壓 21
service iptables off防火牆關閉
tar -xvf 第二層解壓縮
.tar
解包:tar xvf FileName.tar
打包:tar cvf FileName.tar DirName
(註:tar是打包,不是壓縮!)
———————————————
.gz
解壓1:gunzip FileName.gz
解壓2:gzip -d FileName.gz
壓縮:gzip FileName
.tar.gz 和 .tgz
解壓:tar zxvf FileName.tar.gz ./DirName
壓縮:tar zcvf FileName.tar.gz DirName
.tar.bz2
解壓:tar xjf FileName.tar.bz2 ./DirName
壓縮:tar cjf FileName.tar.bz2 DirName
rpm -ivh 加.rpm文件 安裝
安裝sudo apt-get install 軟體名
;『捌』 linux源碼中,.org 0x2000,ENTRY(pg1)表示的是什麼意思org是什麼意思,ENTRY是什麼意思啊
.org 0x2000表示內容填充至地址0x2000。如:你的文件有0x1000位元組,你指定鏈接器ld將該文件的內容載入到內存地址0x0000,這樣文件最末就在地址0x0FFF上,你承認吧。如果在文件的末尾有.org 0x2000這條指令,就說明你要求匯編器用「0x0」填充從地址0x1000到0x2000的內容。 填充的內容可由你自己決定,默認應該是0x0。
ENTRY(pg1)是一個宏
1. .globl pg1
定義全局變數pg1(應該叫符號)。匯編器認為這個符號是唯一的,不能再有和它重名的符號。
2. pg1:
將該符號用作地址助記符。該地址是有程序員顯示指定或者由鏈接器ld分配的。這樣,如果程
序員需要用到該地址上的內容的時候就不需要知道地址的值是多少,而只需要使用符號pg1就
可以 了。
這種定義的形式和 C中的全局變數相同,但絕對不是全局變數。
『玖』 如何在Linux中使用 Truncate 命令
Truncate 命令 通常用於將文件縮小或擴展到指定的大小。如果文件大於指定的大小,則會丟失額外的數據。如果文件較短,則會對其進行擴展,並且擴展部分的讀數為零位元組。
系統環境
Centos 7
安裝
通常操作系統會安裝truncate 命令 ,該命令在coreutils安裝包裡面,如果沒有安裝可以使用下面命令安裝:
[root@localhost ~]# yum provides truncateLoaded plugins: fastestmirror, proct-id, search-disabled-repos, subscription-managerThis system is not registered with an entitlement server. You can use subscription-manager to register.Loading mirror speeds from cached hostfile * base: mirrors.huaweicloud.com * extras: mirrors.aliyun.com * updates: mirrors.aliyun.comcoreutils-8.22-24.el7.x86_64 : A set of basic GNU tools commonly used in shell scriptsRepo : baseMatched from:Filename : /usr/bin/truncatecoreutils-8.22-24.el7.x86_64 : A set of basic GNU tools commonly used in shell scriptsRepo : @anacondaMatched from:Filename : /usr/bin/truncate
可以看到truncate由coreutils安裝包提供,下面安裝coreutils安裝包:
[root@localhost ~]# yum -y install coreutils
truncate常用選項
下面是truncate的常用選項:
-c, --no-create --> 不創建任何文件
-o, --io-blocks --> 將大小視為存儲塊的數量,而不是位元組
-r, --reference=RFILE --> 參考指定的文件大小
-s, --size=SIZE --> 按照指定的位元組設置文件大小
使用truncate清除文件內容
這對於清除日誌文件很有用。truncate過程基本上刪除了文件的所有內容。它不會刪除文件本身,但會將它作為零位元組文件保留在磁碟上。例如,讓我們使用truncate將/var/log/yum.log清除為0個位元組。
[root@localhost ~]# -sh /var/log/yum.log
12K /var/log/yum.log
[root@localhost ~]# truncate -s 0 /var/log/yum.log
再次查看這個文件,發現位元組為0了。查看內容是空的了。
[root@localhost ~]# -sh /var/log/yum.log
0 /var/log/yum.log
[root@localhost ~]# cat /var/log/yum.log
truncate命令將保留文件所有權。可以使用ll -h命令進行確認:
[root@localhost ~]# ll -h /var/log/yum.log
-rw-------. 1 root root 0 Nov 4 18:39 /var/log/yum.log
使用truncate將文件設置為指定大小
下面的示例將文件填充為10K個位元組。
[root@localhost ~]# touch file.txt
[root@localhost ~]# ll -h file.txt
-rw-r--r--. 1 root root 0 Nov 4 18:43 file.txt
[root@localhost ~]# truncate -s 10k file.txt
[root@localhost ~]# ll -h file.txt
-rw-r--r--. 1 root root 10K Nov 4 18:43 file.txt
單位有 K, M, G, T, P, E, Z, Y。
使用truncate擴展文件大小
也可以將文件的大小從當前擴展到所需狀態。使用-s選項,在數字前面加上+
[root@localhost ~]# cat /etc/passwd > file.txt
[root@localhost ~]# ll -h file.txt
-rw-r--r--. 1 root root 1009 Nov 4 18:47 file.txt
[root@localhost ~]# truncate -s +200k file.txt
[root@localhost ~]# ll -h file.txt
-rw-r--r--. 1 root root 201K Nov 4 18:47 file.txt
通過添加額外的200K,這會將文件大小從1K擴展到201K。
使用truncate減小文件大小
假設有一個500K的文件,並且希望將其縮小到250K。將使用-s選項,在數字前面加上-
[root@localhost ~]# touch file.txt
[root@localhost ~]# truncate -s 500k file.txt
[root@localhost ~]# ll -h
total 4.0K
-rw-------. 1 root root 1.3K Dec 29 2019 anaconda-ks.cfg
-rw-r--r--. 1 root root 500K Nov 5 08:36 file.txt
drwxr-xr-x. 5 root root 107 Nov 4 18:22 test
[root@localhost ~]# truncate -s -250k file.txt
[root@localhost ~]# ll -h
total 4.0K
-rw-------. 1 root root 1.3K Dec 29 2019 anaconda-ks.cfg
-rw-r--r--. 1 root root 250K Nov 5 08:36 file.txt
drwxr-xr-x. 5 root root 107 Nov 4 18:22 test
可以看到當前大小更改為250K。
總結
Truncate命令通常用於將文件縮小或擴展到指定的大小。如果文件大於指定的大小,則會丟失額外的數據。如果文件較短,則會對其進行擴展,並且擴展部分的讀數為零位元組。
『拾』 Linux裡面分割,切片是什麼
在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
CentOS_m.iso
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
CentOS1.iso
CentOS.iso
1.2 split命令
split工具的功能是將文件切分為多個小文件。既然要生櫻漏成多個小文件,必然要指定切分文件的單位,支持按行切分以及按文件大小切分,另外還需解決小文件命名的問題。例如,文件名前綴、後綴。如果未明確指定前綴,則默認的前綴為"x"。
以下是命令的語法說明:
例如,將/etc/fstab按行切分,每5行切分一次,並指定小文件的前綴為"fs_",後綴為數值後綴,且後綴長度為2。
[root@linuxidc ~]# split -l 5 -d -a 2 /etc/fstab fs_
[root@linuxidc~]# lsfs_00 fs_01 fs_02
查看任一小文件。
[root@linuxidc ~]# catfs_01
# Accessible filesystems, by reference, are maintained under'/dev/disk'# Seeman pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info#
UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 / xfs defaults 0 0UUID=367d6a77-033b-4037-bbcb-416705ead095 /boot xfs defaults 0 0
可以將這些切分後的小文件重新組裝還原。例如,將上面的三個小文件還原為~/fstab.bak。
[root@linuxidc ~]# cat fs_0[0-2] >~/fstab.bak
還原後,它們的內容是完全一致的。可以使用md5sum比較。
[root@linuxidc ~]# md5sum /etc/fstab ~/fstab.bak
/etc/fstab
/root/fstab.bak
還可以將標准輸入的數據進行切分,並分別寫入到小文件中。例如:
[root@linuxidc ~]# seq 1 2 15 | split -l 3 -d -new_
[root@linuxidc~]# ls new*new_00 new_01 new_02
可以為每個小文件追加額外的後綴。有些老版本的split不支持該選項,而是在csplit上支持的,但是新版本的split已經支持。例如,加上".log"。
[root@linuxidc ~]# seq 1 2 20 | split -l 3 -d -a 3 --additional-suffix=".log" -new1_
[root@linuxidc~]# 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@linuxidc ~]# cattest.txt
SERVER-1[connection]192.168.0.1success
[connection]192.168.0.2failed
[disconnect]192.168.0.3pending
[connection]192.168.0.4success
SERVER-2[connection]192.168.0.1failed
[connection]192.168.0.2failed
[disconnect]192.168.0.3success
[CONNECTION]192.168.0.4pending
SERVER-3[connection]192.168.0.1pending
[connection]192.168.0.2pending
[disconnect]192.168.0.3pending
[connection]192.168.0.4 failed
假設每個SERVER-n表示一個段落,於是要按照段落切分該文件,使用以下語句:
[root@linuxidc ~]# 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@linuxidc ~]# 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@linuxidc ~]# csplit -f test1_ -z -b %04d.log test.txt /SERVER/ {*}140
139
140
還可以指定只拷貝匹配到的行偏移數量。例如,匹配到行時,只拷貝它後面的1行(包括它自身共兩行),但多餘的行將放入下一個小文件中。
[root@linuxidc ~]# csplit -f test2_ -z -b %04d.log test.txt /SERVER/+2 {*}42
139
140
98
第一個小文件只有兩行。
[root@linuxidc ~]# cattest2_0000.log
SERVER-1[connection]192.168.0.1 success
SERVER-1段落的其餘內容放入到了第二個小文件中。
[root@linuxidc ~]# cattest2_0001.log
[connection]192.168.0.2failed
[disconnect]192.168.0.3pending
[connection]192.168.0.4success
SERVER-2[connection]192.168.0.1 failed
同理第三個小文件也一樣,直到最後一個小文件中存放剩餘所有無法匹配的內容。
[root@linuxidc ~]# cattest2_0003.log
[connection]192.168.0.2pending
[disconnect]192.168.0.3pending
[connection]192.168.0.4 failed
指定"-s"或"-q"選項以靜默模式運行,將不會輸出小文件的大小信息。
[root@linuxidc ~]# csplit -q -f test3_ -z -b %04d.log test.txt /SERVER/+2 {*}