常用操作以及概念
求助
1. --help
指令的基本用法與選項介紹。
2. man
man 是 manual 的縮寫,將指令的具體信息顯示出來。
當(dāng)執(zhí)行 man date 時,有 DATE(1) 出現(xiàn),其中的數(shù)字代表指令的類型,常用的數(shù)字及其類型如下:
| 代號 | 類型 |
|---|---|
| 1 | 用戶在 shell 環(huán)境中可以操作的指令或者可執(zhí)行文件 |
| 5 | 配置文件 |
| 8 | 系統(tǒng)管理員可以使用的管理指令 |
3. info
info 與 man 類似,但是 info 將文檔分成一個個頁面,每個頁面可以進(jìn)行跳轉(zhuǎn)。
關(guān)機(jī)
1. sync
為了加快對磁盤上文件的讀寫速度,位于內(nèi)存中的文件數(shù)據(jù)不會立即同步到磁盤上,因此關(guān)機(jī)之前需要先進(jìn)行 sync 同步操作。
2. shutdown
# /sbin/shutdown [-krhc] [時間] [警告訊息]
-k : 不會關(guān)機(jī),只是發(fā)送警告訊息,通知所有在線的用戶
-r : 將系統(tǒng)的服務(wù)停掉后就重新啟動
-h : 將系統(tǒng)的服務(wù)停掉后就立即關(guān)機(jī)
-c : 取消已經(jīng)在進(jìn)行的 shutdown 指令內(nèi)容
3. 其它關(guān)機(jī)指令
reboot、halt、poweroff。
查看進(jìn)程
ps aux | grep threadx
查看端口
netstat -anp | grep 80
PATH
可以在環(huán)境變量 PATH 中聲明可執(zhí)行文件的路徑,路徑之間用 : 分隔。
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin
運行等級
- 0:關(guān)機(jī)模式
- 1:單用戶模式(可用于破解root密碼)
- 2:無網(wǎng)絡(luò)支持的多用戶模式
- 3:有網(wǎng)絡(luò)支持的多用戶模式(文本模式,工作中最常用的模式)
- 4:保留,未使用
- 5:有網(wǎng)絡(luò)支持的 X-windows 多用戶模式(桌面)
- 6:重新引導(dǎo)系統(tǒng),即重啟
sudo
使用 sudo 允許一般用戶使用 root 可執(zhí)行的命令,只有在 /etc/sudoers 配置文件中添加的用戶才能使用該指令。
GNU
GNU 計劃,又譯為革奴計劃,它的目標(biāo)是創(chuàng)建一套完全自由的操作系統(tǒng),稱為 GNU,其內(nèi)容軟件完全以 GPL 方式發(fā)布。其中 GPL 全稱為 GNU 通用公共許可協(xié)議,包含了以下內(nèi)容:
- 以任何目的運行此程序的自由;
- 再復(fù)制的自由;
- 改進(jìn)此程序,并公開發(fā)布改進(jìn)的自由。
包管理工具
RPM 和 DPKG 為最常見的兩類軟件包管理工具。RPM 全稱為 Redhat Package Manager,最早由 Red Hat 公司制定實施,隨后被 GNU 開源操作系統(tǒng)接受并成為很多 Linux 系統(tǒng) (RHEL) 的既定軟件標(biāo)準(zhǔn)。與 RPM 進(jìn)行競爭的是基于 Debian 操作系統(tǒng) (UBUNTU) 的 DEB 軟件包管理工具- DPKG,全稱為 Debian Package,功能方面與 RPM 相似。
YUM 基于 RPM 包管理工具,具有依賴管理功能,并具有軟件升級的功能。
常見發(fā)行版本
Linux 發(fā)行版是 Linux 內(nèi)核及各種應(yīng)用軟件的集成版本。
| 基于的包管理工具 | 商業(yè)發(fā)行版 | 社區(qū)發(fā)行版 |
|---|---|---|
| DPKG | Ubuntu | Debian |
| RPM | Red Hat | Fedora / CentOS |
分區(qū)
磁盤的文件名
Linux 中每個硬件都被當(dāng)做一個文件。
常見磁盤的文件名:
- SCSI/SATA/USB 磁盤:/dev/sd[a-p]
- IDE 磁盤:/dev/hd[a-d]
其中文件名后面的序號的確定與磁盤插入的順序有關(guān),而與磁盤所插入的插槽位置無關(guān)。
分區(qū)表
磁盤分區(qū)表主要有兩種格式,一種是限制較多的 MBR 分區(qū)表,一種是較新且限制較少的 GPT 分區(qū)表。
1. MBR
MBR 中,第一個扇區(qū)最重要,里面有:主要開機(jī)記錄(Master boot record, MBR)及分區(qū)表(partition table),其中 MBR 占 446 bytes,partition table 占 64 bytes。
分區(qū)表只有 64 bytes,最多只能存儲 4 個分區(qū),這 4 個分區(qū)為主分區(qū)(Primary)和擴(kuò)展分區(qū)(Extended)。其中擴(kuò)展分區(qū)只有一個,它將其它空間用來記錄分區(qū)表,可以記錄更多的分區(qū),因此通過擴(kuò)展分區(qū)可以分出更多區(qū)分,這些分區(qū)稱為邏輯分區(qū)。
Linux 也把分區(qū)當(dāng)成文件,分區(qū)文件的命名方式為:磁盤文件名+編號,例如 /dev/sda1。注意,邏輯分區(qū)的編號從 5 開始。
2. GPT
不同的磁盤有不同的扇區(qū)大小,例如 512 bytes 和最新磁盤的 4k。GPT 為了兼容所有磁盤,在定義扇區(qū)上使用邏輯區(qū)塊地址(Logical Block Address, LBA)。
GPT 第 1 個區(qū)塊記錄了 MBR,緊接著是 33 個區(qū)塊記錄分區(qū)信息,并把最后的 33 個區(qū)塊用于對分區(qū)信息進(jìn)行備份。
GPT 沒有擴(kuò)展分區(qū)概念,都是主分區(qū),最多可以分 128 個分區(qū)。
[圖片上傳失敗...(image-a4ddc6-1519868967922)]
開機(jī)檢測程序
1. BIOS
BIOS 是開機(jī)的時候計算機(jī)執(zhí)行的第一個程序,這個程序知道可以開機(jī)的磁盤,并讀取磁盤第一個扇區(qū)的 MBR,由 MBR 執(zhí)行其中的開機(jī)管理程序,這個開機(jī)管理程序的會加載操作系統(tǒng)的核心文件。
MBR 中的開機(jī)管理程序提供以下功能:選單、載入核心文件以及轉(zhuǎn)交其它開機(jī)管理程序。轉(zhuǎn)交這個功能可以用來實現(xiàn)了多重引導(dǎo),只需要將另一個操作系統(tǒng)的開機(jī)管理程序安裝在其它分區(qū)的啟動扇區(qū)上,在啟動 MBR 中的開機(jī)管理程序時,就可以選擇啟動當(dāng)前的操作系統(tǒng)或者轉(zhuǎn)交給其它開機(jī)管理程序從而啟動另一個操作系統(tǒng)。
[圖片上傳失敗...(image-561e33-1519868967922)]
安裝多重引導(dǎo),最好先安裝 Windows 再安裝 Linux。因為安裝 Windows 時會覆蓋掉 MBR,而 Linux 可以選擇將開機(jī)管理程序安裝在 MBR 或者其它分區(qū)的啟動扇區(qū),并且可以設(shè)置開機(jī)管理程序的選單。
2. UEFI
UEFI 相比于 BIOS 來說功能更為全面,也更為安全。
掛載
掛載利用目錄作為分區(qū)的進(jìn)入點,也就是說,進(jìn)入目錄之后就可以讀取分區(qū)的數(shù)據(jù)。
[圖片上傳失敗...(image-3c1b2a-1519868967922)]
文件權(quán)限與目錄配置
文件權(quán)限概念
把用戶分為三種:文件擁有者、群組以及其它人,對不同的用戶有不同的文件權(quán)限。
使用 ls 查看一個文件時,會顯示一個文件的信息,例如 drwxr-xr-x. 3 root root 17 May 6 00:14 .config,對這個信息的解釋如下:
- drwxr-xr-x:文件類型以及權(quán)限,第 1 位為文件類型字段,后 9 位為文件權(quán)限字段。
- 3:鏈接數(shù);
- root:文件擁有者;
- root:所屬群組;
- 17:文件大??;
- May 6 00:14:文件最后被修改的時間;
- .config:文件名。
常見的文件類型及其含義有:
- d:目錄;
- -:文件;
- l:鏈接文件;
9 位的文件權(quán)限字段中,每 3 個為一組,共 3 組,每一組分別代表對文件擁有者、所屬群組以及其它人的文件權(quán)限。一組權(quán)限中的 3 位分別為 r、w、x 權(quán)限,表示可讀、可寫、可執(zhí)行。
文件屬性以及權(quán)限的修改
1. 修改文件所屬群組
# chgrp [-R] groupname dirname/filename
-R:遞歸修改
2. 修改文件擁有者
不僅可以修改文件擁有者,也可以修改文件所屬群組。
# chown [-R] 用戶名:群組名 dirname/filename
3. 修改權(quán)限
可以將一組權(quán)限用數(shù)字來表示,此時一組權(quán)限的 3 個位當(dāng)做二進(jìn)制數(shù)字的位,從左到右每個位的權(quán)值為 4、2、1,即每個權(quán)限對應(yīng)的數(shù)字權(quán)值為 r:4、w:2、x:1。
# chmod [-R] xyz dirname/filename
范例:將 .bashrc 文件的權(quán)限修改為 -rwxr-xr--。
# chmod 754 .bashrc
也可以使用符號來設(shè)定權(quán)限。
# chmod [ugoa] [+-=] [rwx] dirname/filename
- u:擁有者
- g:所屬群組
- o:其他人
- a:所有人
- +:添加權(quán)限
- -:移除權(quán)限
- =:設(shè)定權(quán)限
范例:為 .bashrc 文件的所有用戶添加寫權(quán)限。
# chmod a+w .bashrc
目錄的權(quán)限
文件名不是存儲在一個文件的內(nèi)容中,而是存儲在一個文件所在的目錄中。因此,擁有文件的 w 權(quán)限并不能對文件名進(jìn)行修改。
目錄存儲文件列表,一個目錄的權(quán)限也就是對其文件列表的權(quán)限。因此,目錄的 r 權(quán)限表示可以讀取文件列表;w 權(quán)限表示可以修改文件列表,具體來說,就是添加刪除文件,對文件名進(jìn)行修改;x 權(quán)限可以讓該目錄成為工作目錄,x 權(quán)限是 r 和 w 權(quán)限的基礎(chǔ),如果不能使一個目錄成為工作目錄,也就沒辦法讀取文件列表以及對文件列表進(jìn)行修改了。
文件默認(rèn)權(quán)限
文件默認(rèn)權(quán)限:文件默認(rèn)沒有可執(zhí)行權(quán)限,因此為 666,也就是 -rw-rw-rw- 。
目錄默認(rèn)權(quán)限:目錄必須要能夠進(jìn)入,也就是必須擁有可執(zhí)行權(quán)限,因此為 777 ,也就是 drwxrwxrwx。
可以通過 umask 設(shè)置或者查看文件的默認(rèn)權(quán)限,通常以掩碼的形式來表示,例如 002 表示其它用戶的權(quán)限去除了一個 2 的權(quán)限,也就是寫權(quán)限,因此建立新文件時默認(rèn)的權(quán)限為 -rw-rw-r-- 。
目錄配置
為了使不同 Linux 發(fā)行版本的目錄結(jié)構(gòu)保持一致性,F(xiàn)ilesystem Hierarchy Standard (FHS) 規(guī)定了 Linux 的目錄結(jié)構(gòu)。最基礎(chǔ)的三個目錄如下:
- / (root, 根目錄)
- /usr (unix software resource):所有系統(tǒng)默認(rèn)軟件都會安裝到這個目錄;
- /var (variable):存放系統(tǒng)或程序運行過程中的數(shù)據(jù)文件。
完整的目錄樹如下:
[圖片上傳失敗...(image-bf01c5-1519868967922)]
文件與目錄
文件時間
- modification time (mtime):文件的內(nèi)容更新就會更新;
- status time (ctime):文件的狀態(tài)(權(quán)限、屬性)更新就會更新;
- access time (atime):讀取文件時就會更新。
文件與目錄的基本操作
1. ls
列出文件或者目錄的信息,目錄的信息就是其中包含的文件。
# ls [-aAdfFhilnrRSt] file|dir
-a :列出全部的文件
-d :僅列出目錄本身
-l :以長數(shù)據(jù)串行列出,包含文件的屬性與權(quán)限等等數(shù)據(jù)
2. cp
復(fù)制操作。
如果源文件有兩個以上,則目的文件一定要是目錄才行。
cp [-adfilprsu] source destination
-a :相當(dāng)于 -dr --preserve=all 的意思,至于 dr 請參考下列說明
-d :若來源文件為鏈接文件,則復(fù)制鏈接文件屬性而非文件本身
-i :若目標(biāo)文件已經(jīng)存在時,在覆蓋前會先詢問
-p :連同文件的屬性一起復(fù)制過去
-r :遞歸持續(xù)復(fù)制
-u :destination 比 source 舊才更新 destination,或 destination 不存在的情況下才復(fù)制
--preserve=all :除了 -p 的權(quán)限相關(guān)參數(shù)外,還加入 SELinux 的屬性, links, xattr 等也復(fù)制了
3. rm
移除操作。
# rm [-fir] 文件或目錄
-r :遞歸刪除
4. mv
移動操作。
# mv [-fiu] source destination
# mv [options] source1 source2 source3 .... directory
-f : force 強(qiáng)制的意思,如果目標(biāo)文件已經(jīng)存在,不會詢問而直接覆蓋
獲取文件內(nèi)容
1. cat
取得文件內(nèi)容。
# cat [-AbEnTv] filename
-n :打印出行號,連同空白行也會有行號,-b 不會
2. tac
是 cat 的反向操作,從最后一行開始打印。
3. more
可以一頁一頁查看文件內(nèi)容,和文本編輯器類似。
4. less
和 more 類似。
5. head
可以取得文件前幾行。
# head [-n number] filename
-n :后面接數(shù)字,代表顯示幾行的意思
6. tail
是 head 的反向操作,只是取得是后幾行。
7. od
可以以字符或者十六進(jìn)制的形式顯示二進(jìn)制文件。
8. touch
修改文件時間或者建立新文件。
# touch [-acdmt] filename
-a : 更新 atime
-c : 更新 ctime,若該文件不存在則不建立新文件
-m : 更新 mtime
-d : 后面可以接欲更新的日期而不用當(dāng)前的日期,也可以使用 --date="日期或時間"
-t :后面可以接欲更新的時間而不用當(dāng)前的時間,格式為[YYYYMMDDhhmm]
指令與文件搜索
1. which
指令搜索。
# which [-a] command
-a :將所有指令列出,而不是只列第一個
2. whereis
whereis 搜索文件的速度比較快,因為它只搜索幾個特定的目錄。
# whereis [-bmsu] dirname/filename
3. locate
locate 可以用關(guān)鍵字或者正則表達(dá)式進(jìn)行搜索。
locate 使用 /var/lib/mlocate/ 這個數(shù)據(jù)庫來進(jìn)行搜索,它存儲在內(nèi)存中,并且每天更新一次,所以無法用 locate 搜索新建的文件??梢允褂?updatedb 來立即更新數(shù)據(jù)庫。
# locate [-ir] keyword
-r:接正則表達(dá)式
4. find
find 可以使用文件的屬性和權(quán)限進(jìn)行搜索。
# find filename [option]
4.1 與時間有關(guān)的選項
-mtime n :列出在 n 天前的那一天修改過內(nèi)容的文件
-mtime +n :列出在 n 天之前(不含 n 天本身)修改過內(nèi)容的文件
-mtime -n :列出在 n 天之內(nèi)(含 n 天本身)修改過內(nèi)容的文件
-newer file : 列出比 file 更新的文件
+4、4 和 -4 的指示的時間范圍如下:
[圖片上傳失敗...(image-ef1fcd-1519868967922)]
4.2 與文件擁有者和所屬群組有關(guān)的選項
-uid n
-gid n
-user name
-group name
-nouser :搜索擁有者不存在 /etc/passwd 的文件
-nogroup:搜索所屬群組不存在于 /etc/group 的文件
4.3 與文件權(quán)限和名稱有關(guān)的選項
-name filename
-size [+-]SIZE:搜尋比 SIZE 還要大(+)或小(-)的文件。這個 SIZE 的規(guī)格有:c: 代表 byte,k: 代表 1024bytes。所以,要找比 50KB 還要大的文件,就是 -size +50k
-type TYPE
-perm mode :搜索權(quán)限等于 mode 的文件
-perm -mode :搜索權(quán)限包含 mode 的文件
-perm /mode :搜索權(quán)限包含任一 mode 的文件
磁盤與文件系統(tǒng)
文件系統(tǒng)的組成
對分區(qū)進(jìn)行格式化是為了在分區(qū)上建立文件系統(tǒng)。一個分區(qū)通常只能格式化為一個文件系統(tǒng),但是磁盤陣列等技術(shù)可以將一個分區(qū)格式化為多個文件系統(tǒng),因此只有文件系統(tǒng)能被掛載,而分區(qū)不能被掛載。
文件系統(tǒng)有以下三個結(jié)構(gòu):
- superblock:記錄文件系統(tǒng)的整體信息,包括 inode 和 block 的總量、使用量、剩余量,以及文件系統(tǒng)的格式與相關(guān)信息等;
- inode:一個文件占用一個 inode,記錄文件的屬性,同時記錄此文件的內(nèi)容所在的 block 號碼;
- block:記錄文件的內(nèi)容,文件太大時,會占用多個 block。
當(dāng)要讀取一個文件的內(nèi)容時,先在 inode 中去查找文件內(nèi)容所在的所有 block,然后把所有 block 的內(nèi)容讀出來。
磁盤碎片是指一個文件內(nèi)容所在的 block 過于分散。
Ext2 文件系統(tǒng)使用了上述的文件結(jié)構(gòu),并在此之上加入了 block 群組的概念,也就是將一個文件系統(tǒng)劃分為多個 block 群組,方便管理。
[圖片上傳失敗...(image-8840f7-1519868967922)]
inode
Ext2 文件系統(tǒng)支持的 block 大小有 1k、2k 和 4k 三種,不同的 block 大小限制了單一文件的大小。而每個 inode 大小是固定為 128 bytes。
inode 中記錄了文件內(nèi)容所在的 block,但是每個 block 非常小,一個大文件隨便都需要幾十萬的 block,而一個 inode 大小有限,無法直接引用這么多 block。因此引入了間接、雙間接、三間接引用。間接引用是指,讓 inode 記錄的引用 block 塊當(dāng)成 inode 用來記錄引用信息。
[圖片上傳失敗...(image-60b606-1519868967922)]
inode 具體包含以下信息:
- 該文件的存取模式(read/write/excute);
- 該文件的擁有者與群組(owner/group);
- 該文件的容量;
- 該文件建立或狀態(tài)改變的時間(ctime);
- 最近一次的讀取時間(atime);
- 最近修改的時間(mtime);
- 定義文件特性的旗標(biāo)(flag),如 SetUID...;
- 該文件真正內(nèi)容的指向 (pointer)。
目錄的 inode 與 block
建立一個目錄時,會分配一個 inode 與至少一個 block。block 記錄的內(nèi)容是目錄下所有文件的 inode 編號以及文件名??梢钥闯鑫募?inode 本身不記錄文件名,文件名記錄在目錄中,因此新增文件、刪除文件、更改文件名這些操作與目錄的 w 權(quán)限有關(guān)。
實體鏈接與符號鏈接
# ln [-sf] source_filename dist_filename
-s :默認(rèn)是 hard link,加 -s 為 symbolic link
-f :如果目標(biāo)文件存在時,先刪除目標(biāo)文件
1. 實體鏈接
hard link 只是在某個目錄下新增一個條目,使得新增的條目鏈接到文件的 inode 上。刪除任意一個條目,文件還是存在,只要引用數(shù)量不為 0。
有以下限制:不能跨越 File System;不能對目錄進(jìn)行鏈接。
# ln /etc/crontab .
# ll -i /etc/crontab crontab
34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 crontab
34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/crontab
2. 符號鏈接
symbolic link 可以理解為 Windows 的快捷方式,通過建立一個獨立的文件,這個文件的數(shù)據(jù)的讀取指向鏈接的那個文件。當(dāng)源文件被刪除了,鏈接文件就打不開了。
symbolic link 可以為目錄建立鏈接。
# ll -i /etc/crontab /root/crontab2
34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/crontab
53745909 lrwxrwxrwx. 1 root root 12 Jun 23 22:31 /root/crontab2 -> /etc/crontab
壓縮與打包
壓縮
Linux 底下有很多壓縮文件的擴(kuò)展名,常見的如下:
| 擴(kuò)展名 | 壓縮程序 |
|---|---|
| *.Z | compress |
| *.zip | zip |
| *.gz | gzip |
| *.bz2 | bzip2 |
| *.xz | xz |
| *.tar | tar 程序打包的數(shù)據(jù),沒有經(jīng)過壓縮 |
| *.tar.gz | tar 程序打包的文件,經(jīng)過 gzip 的壓縮 |
| *.tar.bz2 | tar 程序打包的文件,經(jīng)過 bzip2 的壓縮 |
| *.tar.xz | tar 程序打包的文件,經(jīng)過 xz 的壓縮 |
1. gzip
gzip 是 Linux 使用最廣的壓縮指令,可以解開 compress、zip 與 gzip 所壓縮的文件。
經(jīng)過 gzip 壓縮過,源文件就不存在了。
有 9 個不同的壓縮等級可以使用。
可以使用 zcat、zmore、zless 來讀取壓縮文件的內(nèi)容。
$ gzip [-cdtv#] filename
-c :將壓縮的數(shù)據(jù)輸出到屏幕上
-d :解壓縮
-t :檢驗壓縮文件是否出錯
-v :顯示壓縮比等信息
-# : # 為數(shù)字的意思,代表壓縮等級,數(shù)字越大壓縮比越高,默認(rèn)為6
2. bzip2
提供比 gzip 更高的壓縮比。
查看命令:bzcat、bzmore、bzless、bzgrep。
$ bzip2 [-cdkzv#] filename
-k :保留源文件
3. xz
提供比 bzip2 更佳的壓縮比。
可以看到,gzip、bzip2、xz 的壓縮比不斷優(yōu)化。不過要注意,壓縮比越高,壓縮的時間也越長。
查看命令:xzcat、xzmore、xzless、xzgrep。
$ xz [-dtlkc#] filename
打包
壓縮指令只能對一個文件進(jìn)行壓縮,而打包能夠?qū)⒍鄠€文件打包成一個大文件。tar 不僅可以用于打包,也可以使用 gip、bzip2、xz 將打包文件進(jìn)行壓縮。
$ tar [-z|-j|-J] [cv] [-f 新建的tar文件] filename... ==打包壓縮
$ tar [-z|-j|-J] [tv] [-f 已有的tar文件] ==查看
$ tar [-z|-j|-J] [xv] [-f 已有的tar文件] [-C 目錄] ==解壓縮
-z :使用zip;
-j :使用bzip2;
-J :使用xz;
-c :新建打包文件;
-t :查看打包文件里面有哪些文件;
-x :解打包或解壓縮的功能;
-v :在壓縮/解壓縮的過程中,顯示正在處理的文件名;
-f : filename:要處理的文件;
-C 目錄 : 在特定目錄解壓縮。
| 使用方式 | 命令 |
|---|---|
| 打包壓縮 | tar -jcv -f filename.tar.bz2 要被壓縮的文件或目錄名稱 |
| 查 看 | tar -jtv -f filename.tar.bz2 |
| 解壓縮 | tar -jxv -f filename.tar.bz2 -C 要解壓縮的目錄 |
Bash
可以通過 Shell 請求內(nèi)核提供服務(wù),Bash 正是 Shell 的一種。
Bash 特性
1. 命令歷史
記錄使用過的命令。本次登錄所執(zhí)行的命令都會暫時存放到內(nèi)存中, ~/.bash_history 文件中記錄的是前一次登錄所執(zhí)行過的命令。
2. 命令與文件補全
快捷鍵:tab
3. 命名別名
例如 lm 是 ls -al 的別名。
4. shell scripts
5. 通配符
例如 ls -l /usr/bin/X* 列出 /usr/bin 下面所有以 X 開頭的文件。
變量操作
- 對一個變量賦值直接使用 = ;
- 對變量取用需要在變量前加上 <img src="https://latex.codecogs.com/gif.latex?,也可以用"/>{} 的形式;
- 輸出變量使用 echo 命令。
$ var=abc
$ echo $var
$ echo ${var}
變量內(nèi)容如果有空格,需要使用雙引號或者單引號。雙引號內(nèi)的特殊字符可以保留原本特性,例如var="lang is <img src="https://latex.codecogs.com/gif.latex?LANG",則var的值為langiszh_TW.UTF-8;而單引號內(nèi)的特殊字符就是特殊字符本身,例如var='langis"/>LANG',則 var 的值為 lang is $LANG。
可以使用 `指令` 或者 <img src="https://latex.codecogs.com/gif.latex?(指令)的方式將指令的執(zhí)行結(jié)果賦值給變量。例如version="/>(uname -r),則 version 的值為 3.10.0-229.el7.x86_64。
可以使用 export 命令將自定義變量轉(zhuǎn)成環(huán)境變量,環(huán)境變量可以在子程序中使用,所謂子程序就是由當(dāng)前 Bash 而產(chǎn)生的子 Bash。
Bash 的變量可以聲明為數(shù)組和整數(shù)數(shù)字。注意數(shù)字類型沒有浮點數(shù)。如果不進(jìn)行聲明,默認(rèn)是字符串類型。變量的聲明使用 declare 命令:
$ declare [-aixr] variable
-a : 定義為數(shù)組類型
-i : 定義為整數(shù)類型
-x : 定義為環(huán)境變量
-r : 定義為readonly類型
使用 [ ] 來對數(shù)組進(jìn)行操作:
$ array[1]=a
$ array[2]=b
$ echo ${array[1]}
指令搜索順序
- 以絕對或相對路徑來執(zhí)行指令,例如 /bin/ls 或者 ./ls ;
- 由別名找到該指令來執(zhí)行;
- 由 Bash 內(nèi)建的指令來執(zhí)行;
- 按 $PATH 變量指定的搜索路徑的順序找到第一個指令來執(zhí)行。
數(shù)據(jù)流重定向
重定向就是使用文件代替標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出。
- 標(biāo)準(zhǔn)輸入(stdin) ??????:代碼為 0 ,使用 < 或 << ;
- 標(biāo)準(zhǔn)輸出(stdout)?????:代碼為 1 ,使用 > 或 >> ;
- 標(biāo)準(zhǔn)錯誤輸出(stderr):代碼為 2 ,使用 2> 或 2>> ;
其中,有一個箭頭的表示以覆蓋的方式重定向,而有兩個箭頭的表示以追加的方式重定向。
可以將不需要的標(biāo)準(zhǔn)輸出以及標(biāo)準(zhǔn)錯誤輸出重定向到 /dev/null,相當(dāng)于扔進(jìn)垃圾箱。
如果需要將標(biāo)準(zhǔn)輸出以及標(biāo)準(zhǔn)錯誤輸出同時重定向到一個文件,需要將某個輸出轉(zhuǎn)換為另一個輸出,例如 2>&1 表示將標(biāo)準(zhǔn)錯誤輸出轉(zhuǎn)換為標(biāo)準(zhǔn)輸出。
$ find /home -name .bashrc > list 2>&1
管線指令
管線是將一個命令的標(biāo)準(zhǔn)輸出作為另一個命令的標(biāo)準(zhǔn)輸入,在數(shù)據(jù)需要經(jīng)過多個步驟的處理之后才能得到我們想要的格式時就可以使用管線。在命令之間使用 | 分隔各個管線命令。
$ ls -al /etc | less
1. 提取指令:cut
提取過程一行一行地進(jìn)行。
cut 對數(shù)據(jù)進(jìn)行切分,取出想要的部分。
$ cut
-d :分隔符
-f :經(jīng)過 -d 分隔后,使用 -f n 取出第 n 個區(qū)間
-c :以字符為單位取出區(qū)間
范例 1:last 將顯示的登入者的信息,要求僅顯示用戶名。
$ last
root pts/1 192.168.201.101 Sat Feb 7 12:35 still logged in
root pts/1 192.168.201.101 Fri Feb 6 12:13 - 18:46 (06:33)
root pts/1 192.168.201.254 Thu Feb 5 22:37 - 23:53 (01:16)
$ last | cut -d ' ' -f 1
范例 2:將 export 輸出的訊息,取得第 12 字符以后的所有字符串。
$ export
declare -x HISTCONTROL="ignoredups"
declare -x HISTSIZE="1000"
declare -x HOME="/home/dmtsai"
declare -x HOSTNAME="study.centos.vbird"
.....(其他省略).....
$ export | cut -c 12
2. 排序命令:sort、uniq
sort 進(jìn)行排序。
$ sort [-fbMnrtuk] [file or stdin]
-f :忽略大小寫
-b :忽略最前面的空格
-M :以月份的名字來排序,例如 JAN,DEC
-n :使用數(shù)字
-r :反向排序
-u :相當(dāng)于 unique,重復(fù)的內(nèi)容只出現(xiàn)一次
-t :分隔符,默認(rèn)為 tab
-k :指定排序的區(qū)間
范例:/etc/passwd 內(nèi)容是以 : 來分隔的,以第三欄來排序。
$ cat /etc/passwd | sort -t ':' -k 3
root:x:0:0:root:/root:/bin/bash
dmtsai:x:1000:1000:dmtsai:/home/dmtsai:/bin/bash
alex:x:1001:1002::/home/alex:/bin/bash
arod:x:1002:1003::/home/arod:/bin/bash
uniq 可以將重復(fù)的數(shù)據(jù)只取一個。
$ uniq [-ic]
-i :忽略大小寫
-c :進(jìn)行計數(shù)
范例:取得每個人的登錄總次數(shù)
$ last | cut -d ' ' -f 1 | sort | uniq -c
1
6 (unknown
47 dmtsai
4 reboot
7 root
1 wtmp
3. 雙向輸出重定向:tee
輸出重定向會將輸出內(nèi)容重定向到文件中,而 tee 不僅能夠完成這個功能,還能保留屏幕上的輸出。也就是說,使用 tee 指令,一個輸出會同時傳送到文件和屏幕上。
$ tee [-a] file
4. 字符轉(zhuǎn)換指令:tr、col、expand、join、paste
tr 用來刪除一行中的字符,或者對字符進(jìn)行替換。
$ tr [-ds] SET1 ...
-d : 刪除行中 SET1 這個字符串
范例,將 last 輸出的信息所有小寫轉(zhuǎn)換為大寫。
$ last | tr '[a-z]' '[A-Z]'
col 將 tab 字符轉(zhuǎn)為空格字符。
$ col [-xb]
-x : 將 tab 鍵轉(zhuǎn)換成對等的空格鍵
expand 將 tab 轉(zhuǎn)換一定數(shù)量的空格,默認(rèn)是 8 個。
$ expand [-t] file
-t :tab 轉(zhuǎn)為空格的數(shù)量
join 將有相同數(shù)據(jù)的那一行合并在一起。
$ join [-ti12] file1 file2
-t :分隔符,默認(rèn)為空格
-i :忽略大小寫的差異
-1 :第一個文件所用的比較字段
-2 :第二個文件所用的比較字段
paste 直接將兩行粘貼在一起。
$ paste [-d] file1 file2
-d :分隔符,默認(rèn)為 tab
5. 分區(qū)指令:split
split 將一個文件劃分成多個文件。
$ split [-bl] file PREFIX
-b :以大小來進(jìn)行分區(qū),可加單位,例如 b, k, m 等
-l :以行數(shù)來進(jìn)行分區(qū)。
- PREFIX :分區(qū)文件的前導(dǎo)名稱
正規(guī)表示法與文件格式化處理
grep
使用正則表示式把匹配的行提取出來。
$ grep [-acinv] [--color=auto] 搜尋字符串 filename
-a : 將 binary 文件以 text 文件的方式進(jìn)行搜尋
-c : 計算找到個數(shù)
-i : 忽略大小寫
-n : 輸出行號
-v : 反向選擇,亦即顯示出沒有 搜尋字符串 內(nèi)容的那一行
--color=auto :找到的關(guān)鍵字加顏色顯示
范例:把含有 the 字符串的行提取出來(注意默認(rèn)會有 --color=auto 選項,因此以下內(nèi)容在 Linux 中有顏色顯示 the 字符串)
$ grep -n 'the' regular_express.txt
8:I can't finish the test.
12:the symbol '*' is represented as start.
15:You are the best is mean you are the no. 1.
16:The world Happy is the same with "glad".
18:google is the best tools for search keyword
因為 { 與 } 的符號在 shell 是有特殊意義的,因此必須要使用使用轉(zhuǎn)義字符進(jìn)行轉(zhuǎn)義。
$ grep -n 'go\{2,5\}g' regular_express.txt
printf
用于格式化輸出。
它不屬于管道命令,在給 printf 傳數(shù)據(jù)時需要使用 $( ) 形式。
$ printf '%10s %5i %5i %5i %8.2f \n' $(cat printf.txt)
DmTsai 80 60 92 77.33
VBird 75 55 80 70.00
Ken 60 90 70 73.33
awk
$ awk '條件類型1{動作1} 條件類型2{動作2} ...' filename
awk 每次處理一行,處理的最小單位是字段,每個字段的命名方式為:<img src="https://latex.codecogs.com/gif.latex?n,n為字段號,從1開始,"/>0 表示一整行。
范例 1:取出登錄用戶的用戶名和 ip
$ last -n 5
dmtsai pts/0 192.168.1.100 Tue Jul 14 17:32 still logged in
dmtsai pts/0 192.168.1.100 Thu Jul 9 23:36 - 02:58 (03:22)
dmtsai pts/0 192.168.1.100 Thu Jul 9 17:23 - 23:36 (06:12)
dmtsai pts/0 192.168.1.100 Thu Jul 9 08:02 - 08:17 (00:14)
dmtsai tty1 Fri May 29 11:55 - 12:11 (00:15)
$ last -n 5 | awk '{print $1 "\t" $3}
awk 變量:
| 變量名稱 | 代表意義 |
|---|---|
| NF | 每一行擁有的字段總數(shù) |
| NR | 目前所處理的是第幾行數(shù)據(jù) |
| FS | 目前的分隔字符,默認(rèn)是空格鍵 |
范例 2:輸出正在處理的行號,并顯示每一行有多少字段
$ last -n 5 | awk '{print $1 "\t lines: " NR "\t columns: " NF}'
dmtsai lines: 1 columns: 10
dmtsai lines: 2 columns: 10
dmtsai lines: 3 columns: 10
dmtsai lines: 4 columns: 10
dmtsai lines: 5 columns: 9
可以使用大于等于邏輯,其中等于使用 ==。
范例 3:/etc/passwd 文件第三個字段為 UID,對 UID 小于 10 的數(shù)據(jù)進(jìn)行處理。
cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}'
root 0
bin 1
daemon 2
vim 三個模式
[圖片上傳失敗...(image-db196-1519868967922)]
在指令列模式下,有以下命令用于離開或者存儲文件。
| 命令 | 作用 |
|---|---|
| :w | 寫入磁盤 |
| :w! | 當(dāng)文件為只讀時,強(qiáng)制寫入磁盤。到底能不能寫入,與用戶對該文件的權(quán)限有關(guān) |
| :q | 離開 |
| :q! | 強(qiáng)制離開不保存 |
| :wq | 寫入磁盤后離開 |
| :wq! | 強(qiáng)制寫入磁盤后離開 |
參考資料
- 鳥哥. 鳥 哥 的 Linux 私 房 菜 基 礎(chǔ) 篇 第 三 版[J]. 2009.
- Linux 平臺上的軟件包管理