1. 本文知識結構
2. shell 基礎知識
2.1 shell 簡單介紹
GNU bash shell 能提供對 Linux 系統的交互式訪問,一般來說,使用快捷鍵 Ctrl + Alt + T 即可打開 Linux Terminal 。
/etc/passwd 文件包含所有系統用戶賬戶列表以及每個用戶的基本配置信息,從該文件中可以找到各用戶使用的默認 shell 程序。
大多數 Linux 發行版自帶用以查找 shell 命令以及其他 GNU 工具信息的在線手冊。man 命令常用於訪問存儲在 Linux 系統上的手冊頁面。 man man 命令可用來查看手冊頁相關的手冊頁。如果存在不記得命令名的情況,可用 man -k keyword 命令來查找與 keyword 相關的命令,譬如 man -k terminal 即為查找與終端相關的命令。
手冊頁不是唯一的參考資料,另外還有 info 頁面信息,執行 info info 可了解 info 頁面的相關內容。另外,大多數命令都可通過 -help 或 --help 命令獲取幫助信息,譬如 help help。
2.2 linux 文件系統
不同於 Windows 為每個物理磁盤驅動器分配一個盤符,Linux 在獲取路徑時不涉及到驅動器盤符,其文件存儲在虛擬目錄(virtual directory)。虛擬目錄將安裝在PC上的所有存儲設備的文件路徑納入單個目錄結構中。
Linux PC 上安裝的第一塊一盤稱為根驅動器,根驅動器包含了虛擬目錄的核心,其他目錄都是由此開始構建的。Linux 在根驅動器上創建一些掛載點(mount point),這些掛載點是虛擬目錄中用於分配額外存儲設備的目錄,通過把文件和目錄掛載到掛載點目錄中,實現另一驅動器與根驅動器的協同存儲文件。通常系統文件會存儲在根驅動器中,而用戶文件則存儲在另一驅動器中。
常見的 Linux 頂層虛擬目錄名及其內容見下表:
目錄 | 用途 |
---|---|
/ | 虛擬目錄的根目錄,通常不會在此存儲文件 |
/bin | 二進制目錄,存放了用戶級的GNU工具 |
/boot | 啟動目錄,存放啟動文件 |
/dev | 設備目錄,Linux在這里創建設備節點 |
/etc | 系統配置文件目錄 |
/home | 主目錄,Linux在這里創建用戶目錄 |
/lib | 庫目錄,存放系統和應用程序的庫文件 |
/media | 媒體目錄,可移動媒體設備的常用掛載點 |
/mnt | 掛載目錄,另一可移動媒體設備的常用掛載點 |
/opt | 可選目錄,常用於存放第三方軟件包和數據文件 |
/proc | 進程目錄,存放現有硬件及當前進程的相關信息 |
/root | root用戶的主目錄 |
/sbin | 系統二進制目錄,存放許多GNU管理員級工具 |
/run | 運行目錄,存放系統運作時的運行時數據 |
/srv | 服務目錄,存放本地服務的相關文件 |
/sys | 系統目錄,存放系統硬件信息的相關文件 |
/tmp | 臨時目錄,可以在該目錄中創建和刪除臨時工作文件 |
/usr | 用戶二進制目錄,大量用戶級的GNU工具和數據文件都存儲在這里 |
/var | 可變目錄,用以存放經常變化的文件,比如日志文件 |
這些常見的目錄名均基於**文件系統層級標准(filesystem hierarchy standard, FHS)**。Linux 發行版大多遵循了FHS,但由於FHS偶有更新,可能存在標准未同步的情況。
絕對文件路徑定義了在虛擬目錄結構中該目錄的確切位置,以虛擬目錄的根目錄開始,相當於目錄的全名。相對文件路徑允許用戶指定一個基於當前位置的目標文件路勁,它不以代表根目錄的正斜線(/)開頭,而是以目錄名(當前工作目錄下的一個子目錄)或一個特殊的字符(常見的以單點符或雙點符為主)開始。特殊字符的含義如下:
- 單點符( . ),表示當前目錄
- 雙點符( . . ),表示當前目錄的父目錄
2.3 常用 shell 文件命令
常用的shell 文件命令清單
命令 | 用途 |
---|---|
cd | 切換目錄 |
pwd | 顯示當前工作目錄 |
ls | 顯示當前目錄下的文件和目錄 |
touch | 創建空文件或改變文件修改時間 |
cp | 從源對象復制到目標對象 |
ln | 創建符號鏈接或硬鏈接 |
mv | 將文件和目錄移動到另一個位置或重新命名 |
rm | 刪除文件或目錄 |
mkdir | 創建目錄 |
rmdir | 刪除目錄 |
file | 探測文件內部,決定文件類型 |
cat | 顯示文本文件的內容 |
more | 顯示文本文件的內容,每次顯示一頁(分頁工具) |
less | more命令的升級版 |
tail | 顯示文件最后幾行的內容 |
head | 顯示文件開頭幾行的內容 |
文件和目錄列表操作
- 遍歷目錄
#切換目錄
$ cd destination
#顯示當前目錄
$ pwd
destination 參數可以兩種方式表示:絕對文件路徑與相對文件路徑
- 列表命令(ls)
#顯示當前目錄下的目錄和文件
$ ls
#用正斜線(/)和(*)區分顯示當前目錄下的目錄和文件
$ ls -F
#顯示當前目錄下的目錄和文件(包括隱藏文件,隱藏文件以點號開頭)
$ ls -a
#遞歸顯示當前目錄下的目錄和文件(包含子目錄下的文件)
$ ls -R
#顯示長列表(包含文件的更多相關信息,時間列默認為修改時間)
$ ls -l
#查看test_file的詳細信息,其中時間列為訪問時間
$ ls -l --time=atime test_file
#另外,與linux常用短命令相同,它支持將多個參數結合使用,比如
$ ls -alF
- 通配符
問號( ? )代表一個字符;
星號( * )代表零個或多個字符。
文件擴展匹配(file globbing),指的是使用通配符進行模式匹配的過程。除星號、問號之外,還有更多的元字符通配符用於文件擴展匹配,比如中括號( [] )、感嘆號( ! )等。
- 文件處理
#文件不存在時,創建一個空文件,文件存在時,更新文件的修改時間
$ touch test_file
#復制文件或目錄
$ cp source destination
#復制文件或目錄,復制時強制詢問是否需要覆蓋已有文件
$ cp -i source destination
#遞歸復制文件或目錄
$ cp -R source destination
#將文件和目錄移動到另一個位置或者重新命名
$ mv source destination
#將文件和目錄移動到另一個位置或者重新命名,操作時強制詢問
$ mv -i source destination
#刪除文件(加入參數 -i 實現在刪除前詢問)
$ rm -i test_file
#不受提示符打擾地刪除很多文件(使用前確保文件都是你想要刪除的)
$ rm -f test_file*
制表鍵(Tab)自動補全允許你在輸入文件名或目錄名時按一下制表鍵,讓shell幫忙將內容補充完整。
- 鏈接文件
鏈接文件是Linux文件系統的一個優勢。如需要在系統上維護同一文件的兩份或多份副本,除了保存多份單獨的物理文本副本之外,還可以采用保存一份物理文件副本和多個虛擬副本的方法,這些虛擬的副本即鏈接。鏈接是目錄中指向文件真實位置的占位符。在Linux中有兩種不同類型的文件鏈接:符號鏈接和硬鏈接。
符號鏈接是一個實實在在的文件,它指向存放在虛擬目錄結構中某個地方的另一個文件。這兩個通過符號鏈接在一起的文件,彼此內容並不相同。通過對比符號鏈接文件和數據文件的文件大小與inode編號均可知曉兩者並非一個文件。
#為test_file創建符號鏈接test_file_sl
$ ln -s test_file test_file_sl
#查看可與test_file*通配的文件的inode編號
$ ls -i test_file*
硬鏈接會創建獨立的虛擬文件,其中包含了原始文件的信息及位置,但是它們從根本上而言是同一個文件。引用硬鏈接文件等同於引用了源文件。要創建硬鏈接,原始文件也必須時間存在。
#為test_file創建硬鏈接test_file_hl
$ ln test_file test_file_hl
#查看可與test_file*通配的文件的inode編號
$ ls -i test_file*
注意:只能對處於同一存儲媒體的文件創建硬鏈接。要想在不同存儲媒體的文件之間創建鏈接,只能使用符號鏈接。同一個文件可以擁有多個鏈接,但不要創建軟鏈接文件的軟鏈接。混亂的鏈接鏈不僅會容易斷裂,還會造成各種麻煩。
- 處理目錄
#創建目錄
$ mkdir new_dir
#創建多個目錄及子目錄
$ mkdir -p new_dir/sub_dir/under_dir
#刪除目錄(默認情況下,rmdir命令只能刪除空目錄)
$ rmdir new_dir
#刪除非空目錄(-i參數僅表詢問,先刪除目錄下的文件再刪除目錄)
$ rm -ri new_dir
#不做提示地刪除目錄下的子目錄及文件
$ rm -rf new_dir
#展示目錄結構
$ tree new_dir
- 查看文件
#查看文件類型
$ file test_file
#查看文件內容
$ cat test_file
#查看文件內容,所有行加上行號
$ cat -n test_file
#查看文件內容,有文本行加上行號
$ cat -b test_file
#查看文件內容,不出現制表符
$ cat -T test_file
#顯示文本文件內容,每次顯示一頁
$ more test_file
#其他顯示命令less, more命令的升級版,詳訊 man less
#查看文件的末尾(默認10行)
$ tail test_file
#查看文件的末尾2行
$ tail -n 2 test_file
$ tail -2 test_file
#查看文件的開頭(默認10行)
$ head test_file
#查看文件的開頭10行
$ head -n 10 test_file
$ head -10 test_file
3. shell 系統交互命令
3.1 管理進程
當程序運行再系統上時,我們稱之為進程(process),在Linux系統中,我們可以使用 ps 命令監測進程的運行情況。
Linux系統種使用GNU ps命令支持3種不同類型的命令行參數:
- Unix風格參數,前面加單破折線
- BSD風格參數,前面不加破折線
- GNU風格的長參數,前面加雙破折線
#ps 命令的基本情況(進程ID/Process ID,運行終端/TTY,進程已用的CPU時間)
$ ps
Unix風格的 ps 命令參數
參數 | 描述 |
---|---|
-A | 顯示所有進程 |
-N | 顯示與指定參數不符的所有進程 |
-a | 顯示除控制進程(session leader)和無終端進程外的所有進程 |
-d | 顯示除控制進程外的所有進程 |
-e | 顯示所有進程 |
-C cmdlist | 顯示包含在cmdlist列表中的進程 |
-G grplist | 顯示組ID在grplist列表中的進程 |
-U userlist | 顯示屬主的用戶ID 在userlist列表中的進程 |
-g grplist | 顯示會話或組ID在grplist列表中的進程 |
-p pidlist | 顯示PID在pidlist中的進程 |
-s sesslist | 顯示會話ID在sesslist列表中的進程 |
-t ttylist | 顯示終端ID在ttylist列表中的進程 |
-u userlist | 顯示有效用戶ID在userlist列表中的進程 |
-F | 顯示更多額外輸出(相對-f參數而言) |
-O format | 顯示默認的輸出列以及format列表指定的列 |
-M | 顯示進程的安全信息 |
-c | 顯示進程的額外調度器信息 |
-f | 顯示完整格式的輸出 |
-j | 顯示任務信息 |
-l | 顯示長列表 |
-o format | 僅顯示由format指定的列 |
-y | 不要顯示進程標記(process flag,表明進程狀態的標記) |
-z | 顯示安全標簽(security context)信息 |
-H | 用層級格式來顯示進程(樹狀,用來顯示父進程) |
-n namelist | 定義了WCHAN列顯示的值 |
-w | 采用寬輸出模式,不限寬度顯示 |
-L | 顯示進程中的線程 |
-V | 顯示ps命令的版本號 |
擴展列信息
英文簡稱 | 列描述 |
---|---|
UID | 啟動這些進程的用戶 |
PID | 進程的進程ID |
PPID | 父進程的進程號 |
C | 進程生命周期中的CPU利用率 |
STIME | 進程啟動時的系統時間 |
TTY | 進程啟動時的終端設備 |
TIME | 運行進程需要的累計CPU時間 |
CMD | 啟動的程序名稱 |
F | 內核分配給進程的系統標記 |
S | 進程的狀態(O代表正在運行;S代表在休眠;R代表可運行,正等待運行;Z代表僵化,進程已結束但父進程已不存在;T代表停止)。 |
PRI | 進程的優先級(越大的數字代表越低的優先級) |
NI | 謙讓度值用來參與決定優先值 |
ADDR | 進程的內存地址 |
SZ | 假如進程被換出,所需交換空間的大致大小 |
WCHAN | 進程休眠的內核函數的地址 |
GNU風格的ps命令參數
參數 | 描述 |
---|---|
--deselect | 顯示所有進程,命令行中列出的進程 |
--Group grplist | 顯示組ID在grplist列表中的進程 |
--User userlist | 顯示用戶ID在userlist列表中的進程 |
--group grplist | 顯示有效組ID在grplist列表中的進程 |
--pid pidlist | 顯示PID在pidlist列表中的進程 |
--ppid pidlist | 顯示父PID在pidlist列表中的進程 |
--sid sidlist | 顯示會話ID在sidlist列表中的進程 |
--tty ttylist | 顯示終端設備號在ttylist列表中的進程 |
--user userlist | 顯示有效用戶ID在userlist列表中的進程 |
--format format | 僅顯示由format指定的列 |
--context | 顯示額外的安全信息 |
--coles n | 將屏幕寬度設置為n列 |
--columns n | 將屏幕寬度設置為n列 |
--cumulative | 包含已停止的子進程的信息 |
--forest | 用層級結構顯示出進程和父進程之間的關系 |
--headers | 在每頁輸出中都顯示列的頭 |
--no-headers | 不顯示列的頭 |
--lines n | 將屏幕高度設為n行 |
--rows n | 將屏幕高度設為n排 |
--sort order | 指定將輸出按哪列排序 |
--width n | 將屏幕寬度設為n列 |
--help | 顯示幫助信息 |
--info | 顯示調試信息 |
--version | 顯示ps命令的版本號 |
top 命令與 ps 命令像是,能夠顯示進程信息,但它是實時顯示的。默認情況下,top 命令在啟動時會按照 %CPU 值對進程排序,可以在 top 運行時使用多種交互命令重新排序。每一個交互式命令都是單字符,在 top 命令運行時鍵入可改變 top 的行為。鍵入 f 允許你選擇對輸出進行排序的字段,鍵入 d 允許你修改輪詢間隔,鍵入 q 可以推出 top。
- 第一行:當前時間、系統的運行時間、登錄的用戶數以及系統的平均負載
- 第二行:進程概要信息/進程狀態信息
- 第三行:CPU概要信息
- 第四行:系統物理內存狀態
- 第五行:系統交換空間狀態
- 最后一部分:當前運行中的進程的詳細列表
英文簡稱 | 列描述 |
---|---|
PID | 進程的ID |
USER | 進程屬主的名字 |
PR | 進程的優先級 |
NI | 進程的謙讓度值 |
VIRT | 進程占用的虛擬內存總量 |
RES | 進程占用的物理內存總量 |
SHR | 進程與其他進程共享的內存總量 |
S | 進程的狀態(D代表可中斷的休眠狀態,R代表在運行狀態,S代表休眠狀態,T代表跟蹤狀態或停止狀態,Z代表僵化狀態) |
%CPU | 進程使用的CPU時間比例 |
%MEM | 進程使用的內存占可用內存的比例 |
TIME+ | 自進程啟動到目前為止的CPU時間總量 |
COMMAND | 進程所對應的命令行名稱,也就是啟動的程序名 |
在 Linux 中,進程之間通過信號來通信。進程的信號就是預定義好的一個消息,進程能識別它並決定忽略還是作出反應。進程如何處理信號是由開發人員通過編程來決定的
信號 | 名稱 | 描述 |
---|---|---|
1 | HUP | 掛起 |
2 | INT | 中斷 |
3 | QUIT | 結束運行 |
9 | KILL | 無條件終止 |
11 | SEGV | 段錯誤 |
15 | TERM | 盡可能終止 |
17 | STOP | 無條件停止運行,但不終止 |
18 | TSTP | 停止或暫停,但繼續在后台運行 |
19 | CONT | 在STOP或TSTP之后恢復執行 |
#要發送進程信息,你必須時進程的屬主或登錄為root用戶
#kill命令可通過進程PID給進程發信號,默認為TERM信號
$ kill 3940
#kill命令可通過 -s 參數支持指定其他信號(用信號名或信號值)
$ kill -s HUP 3940
#要檢察kill命令是否有效,可再運行 ps 命令或 top 命令,看看問題進程是否停止。
#killall命令支持通配符,可再系統負載過大而變得慢快速結束進程
$ killall http*
3.2 獲取磁盤統計信息
df 命令可以方便的地查看所有已掛載的磁盤的使用情況。
du 命令可以顯示某個特定目錄(默認情況下是當前目錄)的磁盤使用情況。這一方法可用來快死判斷系統上某個目錄下是不是有超大文件。
# 查看磁盤使用情況
$ df
# 以用戶易讀的形式顯示磁盤使用情況
$ df -h
# 顯示某個目錄下磁盤使用情況(具體到占用磁盤塊數)
$ du
# 顯示某個目錄下磁盤使用情況(顯示所有已列出文件總的大小)
$ du -c
# 顯示某個目錄下磁盤使用情況(以用戶易讀的形式)
$ du -h
# 顯示某個目錄下磁盤使用情況(顯示每個輸出參數的總計)
$ du -s
3.3 掛載新磁盤
Linux文件系統將所有磁盤都比購入一個虛擬目錄下。在使用新的存儲媒體之氣那,需要把它放到虛擬目錄下,即為掛載(mounting)。在圖形化桌面環境里,大多數Linux發行版都能自動掛載特定類型的可移動存儲媒體。
默認情況下,mount 命令會輸出當前系統上掛載的設備列表。
# 手動掛在媒體設備的基本命令:
$ mount -t type device directory
#type參數指定了磁盤被格式化的文件系統類型,常見類型有 vfat,ntfs,iso9660;后面兩個參數定義了了該存儲設備的設備文件的位置以及掛載點在虛擬目錄中的位置。
mount命令的參數
參數 | 描述 |
---|---|
-a | 掛載/etc/fstab文件中指定的所有文件系統 |
-f | 使mount命令模擬掛載設備,但並不真的掛載 |
-F | 與-a參數一起使用時,會同時掛載所有文件系統 |
-v | 詳細模式,將會說明掛載設備的每一步 |
-I | 不啟用任何/sbin/mount.filesystem下的文件系統幫助文件 |
-l | 給ext2、ext3或XFS文件系統自動添加文件系統標簽 |
-n | 掛載設備,但不注冊到/etc/mtab已掛載設備文件中 |
-p num | 進行加密掛載時,從文件描述符num中獲得密碼短語 |
-s | 忽略該文件系統不支持的掛載選項 |
-r | 將設備掛載為只讀的 |
-w | 將設備掛載為可讀寫的 |
-L label | 將設備按指定的label掛載 |
-U uuid | 將設備按指定的uuid掛載 |
-O | 和-a參數一起使用,限制命令只作用到特定的一組文件系統上 |
-o | 給文件系統添加特定選項 |
-o參數允許掛載文件系統時添加一些以逗號分隔的額外選項,常見的有:
ro: 以只讀形式掛載
rw: 以讀寫形式掛載
user: 允許普通用戶掛載文件系統
check=none: 掛載文件系統時不進行完整性校驗
loop: 掛載一個文件
從 Linux 系統上移出一個可移動設備時,不能直接從系統上移出,而應該先卸載。umount 命令支持通過設備文件或者掛載點來指定要卸載的設備。
$ umount [directory | device ]
3.4 數據處理
- 排序數據
#按指定的默認語言排序規則對文本文件中的數據行排序
$ sort test_file
#把數字識別為數值而非字符,並按值排序
$ sort -n test_file
#按月排序(Jan\Feb\Mar\Apr\...)
$ sort -M test_file
sort 命令參數
單破折線 | 雙破折線 | 描述 |
---|---|---|
-b | --ignore-leading-blanks | 排序時忽略起始的空白 |
-C | --check=quiet | 不排序,如果數據無序也不要報告 |
-c | --check | 不排序,但檢查輸入數據是不是已排序,未排序的話,報告 |
-d | --dictionary-order | 僅考慮空白和字母,不考慮特殊字符 |
-f | --ignore-case | 默認情況下,會將大寫字母排在前面;這個參數會忽略大小寫 |
-g | --general-number-sort | 按通用數值排序(跟-n不同,把值當浮點數來排序,支持科學計數法表示的值) |
-i | --ignore-nonprinting | 載排序時忽略不可打印字符 |
-k | --key=POS1[,POS2] | 排序從POS1位置開始,如果制定了POS2的話,到POS2位置結束 |
-M | --month-sort | 用三字符月份名按月份排序 |
-m | --merge | 將兩個已排序數據文件合並 |
-n | --numeric-sort | 按字符串數值來排序 |
-o | --output=file | 將排序結果寫出到指定的文件中 |
-R | --random-sort | 按隨機生成的散列表的鍵值排序 |
--random-source=FILE | 指定-R參數用到的隨機字節的源文件 | |
-r | --reverse | 反序排序(升序變降序) |
-S | --buffer-size=SIZE | 指定使用的內存大小 |
-s | --stable | 禁用最后重排序比較 |
-T | --temporary-directory=DIR | 指定一個位置來存儲臨時工作文件 |
-t | --field-separator=SEP | 指定一個用來區分鍵位置的字符 |
-u | --unique | 和-c參數一起使用時,檢查嚴格排序;不和-c參數一起使用時,僅輸出第一例相似的兩行 |
-z | --zero-terminated |
grep命令會載輸入或指定的文件中查找匹配指定模式的字符的行。grep的輸出就是包含了匹配模式的行。
# 基本文件查找
$ grep [options] pattern [file]
# 反向搜索
$ grep -v t file1
# 顯示匹配行所在行號
$ grep -n t file1
# 統計有多少行含有匹配模式
$ grep -c t file1
# 指定多個匹配模式(滿足某一個即可)
$ grep -e t -e f file1
默認情況下,grep 命令用基本的Unix風格正則表達式來匹配模式。
egrep 命令是 grep 命令的一個衍生,支持POSIX擴展正則表達式。fgrep 命令支持將匹配模式指定為用換行符分隔的一系列固定長度的字符串。
Linux文件壓縮工具
工具 | 文件擴展名 | 描述 |
---|---|---|
bzip2 | .bz2 | 采用Burrows-Wheeler塊排序文本壓縮算法和霍夫曼編碼 |
compress | .Z | 最初的Unix文件壓縮工具 |
gzip | .gz | GNU壓縮工具,用Lempel-Ziv編碼 |
zip | .zip | Windows上PKZIP工具的Unix實現 |
gzip軟件包是GNU項目的產物,意在編寫一個能夠替代原先Unix中compress工具的免費版本。其中含有以下工具:
- gzip: 壓縮文件
- gzcat: 查看壓縮過的文本文件內容
- gunzip: 解壓文件
tar 命令是給整個目錄結構創建歸檔文件的簡便方法,是Linux中分發開源程序源碼文件所采用的普遍方法。
# tar命令的格式
$ tar function [options] object1 object2 ...
tar命令的功能function
功能 | 長名稱 | 描述 |
---|---|---|
-A | --concatenate | 將一個已有tar歸檔文件追加到另一個已有tar歸檔文件 |
-c | --create | 創建一個新的tar歸檔文件 |
-d | --diff | 檢查歸檔文件和文件系統的不同之處 |
--delete | 從已有tar歸檔文件中刪除 | |
-r | --append | 追加文件到已有tar歸檔文件末尾 |
-t | --list | 列出已有tar歸檔文件的內容 |
-u | --update | 將比tar歸檔文件中已有的同名文件新的文件追加到tar歸檔文件中 |
-x | --extract | 從已有tar歸檔文件中提取文件 |
tar命令的選項options
選項options | 描述 |
---|---|
-C dir | 切換到指定目錄 |
-f file | 輸出結果到文件或設備file |
-j | 將輸出重定向給bzip2命令來壓縮內容 |
-p | 保留所有文件權限 |
-v | 在處理文件時顯示文件 |
-z | 將輸出重定向給gzip命令來壓縮內容 |
注意:下載了開源軟件之后,經常文件名是以 .tgz 結尾的,這些是gzip壓縮過的tar文件,可以用命令 tar -zxvf filename.tgz 來解壓。
參考文獻:Linux命令行與shell腳本編程大全(第三版) Richard Blum , Christine Bresnahan