Linux命令大總結(jié),一篇就夠了(建議新手收藏)
前言:Linux 的學(xué)習(xí)對(duì)于一個(gè)程序員的重要性是不言而喻的。前端開(kāi)發(fā)相比后端開(kāi)發(fā),接觸?Linux
機(jī)會(huì)相對(duì)較少,因此往往容易忽視它。但是學(xué)好它卻是程序員必備修養(yǎng)之一。
Linux 基礎(chǔ)
操作系統(tǒng)
操作系統(tǒng)?Operating System
?簡(jiǎn)稱?OS
?,是軟件的一部分,它是硬件基礎(chǔ)上的第一層軟件,是硬件和其它軟件溝通的橋梁。
操作系統(tǒng)會(huì)控制其他程序運(yùn)行,管理系統(tǒng)資源,提供最基本的計(jì)算功能,如管理及配置內(nèi)存、決定系統(tǒng)資源供需的優(yōu)先次序等,同時(shí)還提供一些基本的服務(wù)程序。

什么是 Linux
Linux 系統(tǒng)內(nèi)核與 Linux 發(fā)行套件的區(qū)別
Linux
?系統(tǒng)內(nèi)核指的是由?Linus Torvalds
?負(fù)責(zé)維護(hù),提供硬件抽象層、硬盤及文件系統(tǒng)控制及多任務(wù)功能的系統(tǒng)核心程序。Linux
?發(fā)行套件系統(tǒng)是我們常說(shuō)的?Linux
?操作系統(tǒng),也即是由?Linux
?內(nèi)核與各種常用軟件的集合產(chǎn)品。
總結(jié):真正的?Linux
?指的是系統(tǒng)內(nèi)核,而我們常說(shuō)的?Linux
?指的是“發(fā)行版完整的包含一些基礎(chǔ)軟件的操作系統(tǒng)”。
Linux 對(duì)比 Windows
穩(wěn)定且有效率;
免費(fèi)(或少許費(fèi)用);
漏洞少且快速修補(bǔ);
多任務(wù)多用戶;
更加安全的用戶與文件權(quán)限策略;
適合小內(nèi)核程序的嵌入系統(tǒng);
相對(duì)不耗資源。
Linux 系統(tǒng)種類
紅帽企業(yè)版?
Linux
?:RHEL
?是全世界內(nèi)使用最廣泛的?Linux
?系統(tǒng)。它具有極強(qiáng)的性能與穩(wěn)定性,是眾多生成環(huán)境中使用的(收費(fèi)的)系統(tǒng)。Fedora
?:由紅帽公司發(fā)布的桌面版系統(tǒng)套件,用戶可以免費(fèi)體驗(yàn)到最新的技術(shù)或工具,這些技術(shù)或工具在成熟后會(huì)被加入到?RHEL
?系統(tǒng)中,因此?Fedora
?也成為?RHEL
?系統(tǒng)的試驗(yàn)版本。CentOS
?:通過(guò)把?RHEL
?系統(tǒng)重新編譯并發(fā)布給用戶免費(fèi)使用的?Linux
?系統(tǒng),具有廣泛的使用人群。Deepin
?:中國(guó)發(fā)行,對(duì)優(yōu)秀的開(kāi)源成品進(jìn)行集成和配置。Debian
?:穩(wěn)定性、安全性強(qiáng),提供了免費(fèi)的基礎(chǔ)支持,在國(guó)外擁有很高的認(rèn)可度和使用率。Ubuntu
?:是一款派生自?Debian
?的操作系統(tǒng),對(duì)新款硬件具有極強(qiáng)的兼容能力。Ubuntu
?與?Fedora
?都是極其出色的?Linux
?桌面系統(tǒng),而且?Ubuntu
?也可用于服務(wù)器領(lǐng)域。
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【865977150】整理了一些個(gè)人覺(jué)得比較好的學(xué)習(xí)書(shū)籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。?!前100名進(jìn)群領(lǐng)取,額外贈(zèng)送一份價(jià)值699的內(nèi)核資料包(含視頻教程、電子書(shū)、實(shí)戰(zhàn)項(xiàng)目及代碼)

終端連接阿里云服務(wù)器

通過(guò)執(zhí)行?ssh root@121.42.11.34
?命令,然后輸入服務(wù)器連接密碼就可以順利登陸遠(yuǎn)程服務(wù)器。從現(xiàn)在開(kāi)始我們就可以在本地電腦操作遠(yuǎn)程服務(wù)器。
這個(gè)黑色的面板就是終端也就是?
Shell
?(命令行環(huán)境)。ssh root@xxx
?這是一條命令,必須要在?Shell
?中才能執(zhí)行。
Shell
Shell
?這個(gè)單詞的原意是“外殼”,跟?kernel
(內(nèi)核)相對(duì)應(yīng),比喻內(nèi)核外面的一層,即用戶跟內(nèi)核交互的對(duì)話界面。
Shell
?是一個(gè)程序,提供一個(gè)與用戶對(duì)話的環(huán)境。這個(gè)環(huán)境只有一個(gè)命令提示符,讓用戶從鍵盤輸入命令,所以又稱為命令行環(huán)境(?command line interface
?,簡(jiǎn)寫(xiě)為?CLI
?)。Shell
?接收到用戶輸入的命令,將命令送入操作系統(tǒng)執(zhí)行,并將結(jié)果返回給用戶。Shell
?是一個(gè)命令解釋器,解釋用戶輸入的命令。它支持變量、條件判斷、循環(huán)操作等語(yǔ)法,所以用戶可以用?Shell
?命令寫(xiě)出各種小程序,又稱為?Shell
?腳本。這些腳本都通過(guò)Shell
?的解釋執(zhí)行,而不通過(guò)編譯。Shell
?是一個(gè)工具箱,提供了各種小工具,供用戶方便地使用操作系統(tǒng)的功能。
Shell 的種類
Shell
?有很多種,只要能給用戶提供命令行環(huán)境的程序,都可以看作是?Shell
?。
歷史上,主要的?Shell
?有下面這些:
Bourne Shell(sh)
Bourne Again shell(bash)
C Shell(csh)
TENEX C Shell(tcsh)
Korn shell(ksh)
Z Shell(zsh)
Friendly Interactive Shell(fish)
其中?Bash
?是目前最常用的?Shell
?。MacOS
?中的默認(rèn)?Shell
?就是?Bash
?。
通過(guò)執(zhí)行?echo $SHELL
?命令可以查看到當(dāng)前正在使用的?Shell
?。還可以通過(guò)?cat /etc/shells
?查看當(dāng)前系統(tǒng)安裝的所有?Shell
?種類。
命令
命令行提示符
進(jìn)入命令行環(huán)境以后,用戶會(huì)看到?Shell
?的提示符。提示符往往是一串前綴,最后以一個(gè)美元符號(hào)?$
?結(jié)尾,用戶可以在這個(gè)符號(hào)后面輸入各種命令。
執(zhí)行一個(gè)簡(jiǎn)單的命令?pwd
?:
[root@iZm5e8dsxce9ufaic7hi3uZ ~]# pwd/root
命令解析:
root
:表示用戶名;iZm5e8dsxce9ufaic7hi3uZ
:表示主機(jī)名;~
:表示目前所在目錄為家目錄,其中?root
?用戶的家目錄是?/root
?普通用戶的家目錄在?/home
?下;#
:指示你所具有的權(quán)限(?root
?用戶為?#
?,普通用戶為?$
?)。執(zhí)行?
whoami
?命令可以查看當(dāng)前用戶名;執(zhí)行?
hostname
?命令可以查看當(dāng)前主機(jī)名;
關(guān)于如何創(chuàng)建、切換、刪除用戶,在后面的用戶與權(quán)限會(huì)具體講解,這里先使用?root
?用戶進(jìn)行演示。
[備注]?root
?是超級(jí)用戶,具備操作系統(tǒng)的一切權(quán)限。
命令格式
command parameters(命令 參數(shù))
長(zhǎng)短參數(shù)
單個(gè)參數(shù):ls -a(a 是英文 all 的縮寫(xiě),表示“全部”)
多個(gè)參數(shù):ls -al(全部文件 + 列表形式展示)
單個(gè)長(zhǎng)參數(shù):ls --all
多個(gè)長(zhǎng)參數(shù):ls --reverse --all
長(zhǎng)短混合參數(shù):ls --all -l
參數(shù)值
短參數(shù):command -p 10(例如:ssh root@121.42.11.34 -p 22)
長(zhǎng)參數(shù):command --paramters=10(例如:ssh root@121.42.11.34 --port=22)
快捷方式
在開(kāi)始學(xué)習(xí)?Linux
?命令之前,有這么一些快捷方式,是必須要提前掌握的,它將貫穿整個(gè)?Linux
?使用生涯。
通過(guò)上下方向鍵 ↑ ↓ 來(lái)調(diào)取過(guò)往執(zhí)行過(guò)的?
Linux
?命令;命令或參數(shù)僅需輸入前幾位就可以用?
Tab
?鍵補(bǔ)全;Ctrl + R
?:用于查找使用過(guò)的命令(history
?命令用于列出之前使用過(guò)的所有命令,然后輸入?!
?命令加上編號(hào)(?!2
?)就可以直接執(zhí)行該歷史命令);Ctrl + L
:清除屏幕并將當(dāng)前行移到頁(yè)面頂部;Ctrl + C
:中止當(dāng)前正在執(zhí)行的命令;Ctrl + U
:從光標(biāo)位置剪切到行首;Ctrl + K
:從光標(biāo)位置剪切到行尾;Ctrl + W
:剪切光標(biāo)左側(cè)的一個(gè)單詞;Ctrl + Y
:粘貼?Ctrl + U | K | Y
?剪切的命令;Ctrl + A
:光標(biāo)跳到命令行的開(kāi)頭;Ctrl + E
:光標(biāo)跳到命令行的結(jié)尾;Ctrl + D
:關(guān)閉?Shell
?會(huì)話;
文件和目錄
文件的組織

查看路徑
pwd
顯示當(dāng)前目錄的路徑

which
查看命令的可執(zhí)行文件所在路徑,?Linux
?下,每一條命令其實(shí)都對(duì)應(yīng)一個(gè)可執(zhí)行程序,在終端中輸入命令,按回車的時(shí)候,就是執(zhí)行了對(duì)應(yīng)的那個(gè)程序,?which
?命令本身對(duì)應(yīng)的程序也存在于?Linux
?中。
總的來(lái)說(shuō)一個(gè)命令就是一個(gè)可執(zhí)行程序。

瀏覽和切換目錄
ls
列出文件和目錄,它是?Linux
?最常用的命令之一。
【常用參數(shù)】
-a
?顯示所有文件和目錄包括隱藏的-l
?顯示詳細(xì)列表-h
?適合人類閱讀的-t
?按文件最近一次修改時(shí)間排序-i
?顯示文件的?inode
?(?inode
?是文件內(nèi)容的標(biāo)識(shí))

cd
cd
?是英語(yǔ)?change directory
?的縮寫(xiě),表示切換目錄。
cd / --> 跳轉(zhuǎn)到根目錄
cd ~ --> 跳轉(zhuǎn)到家目錄
cd .. --> 跳轉(zhuǎn)到上級(jí)目錄
cd ./home --> 跳轉(zhuǎn)到當(dāng)前目錄的home目錄下
cd /home/lion --> 跳轉(zhuǎn)到根目錄下的home目錄下的lion目錄
cd --> 不添加任何參數(shù),也是回到家目錄
[注意] 輸入cd /ho
?+ 單次?tab
?鍵會(huì)自動(dòng)補(bǔ)全路徑 + 兩次?tab
?鍵會(huì)列出所有可能的目錄列表。
du
列舉目錄大小信息。
【常用參數(shù)】
-h
?適合人類閱讀的;-a
?同時(shí)列舉出目錄下文件的大小信息;-s
?只顯示總計(jì)大小,不顯示具體信息。
瀏覽和創(chuàng)建文件
cat
一次性顯示文件所有內(nèi)容,更適合查看小的文件。
cat cloud-init.log
【常用參數(shù)】
-n
?顯示行號(hào)。
less
分頁(yè)顯示文件內(nèi)容,更適合查看大的文件。
less cloud-init.log
【快捷操作】
空格鍵:前進(jìn)一頁(yè)(一個(gè)屏幕);
b
?鍵:后退一頁(yè);回車鍵:前進(jìn)一行;
y
?鍵:后退一行;上下鍵:回退或前進(jìn)一行;
d
?鍵:前進(jìn)半頁(yè);u
?鍵:后退半頁(yè);q
?鍵:停止讀取文件,中止?less
?命令;=
?鍵:顯示當(dāng)前頁(yè)面的內(nèi)容是文件中的第幾行到第幾行以及一些其它關(guān)于本頁(yè)內(nèi)容的詳細(xì)信息;h
?鍵:顯示幫助文檔;/
?鍵:進(jìn)入搜索模式后,按?n
?鍵跳到一個(gè)符合項(xiàng)目,按?N
?鍵跳到上一個(gè)符合項(xiàng)目,同時(shí)也可以輸入正則表達(dá)式匹配。
head
顯示文件的開(kāi)頭幾行(默認(rèn)是10行)
head cloud-init.log
【參數(shù)】
-n
?指定行數(shù)?head cloud-init.log -n 2
tail
顯示文件的結(jié)尾幾行(默認(rèn)是10行)
tail cloud-init.log
【參數(shù)】
-n
?指定行數(shù)?tail cloud-init.log -n 2
-f
?會(huì)每過(guò)1秒檢查下文件是否有更新內(nèi)容,也可以用?-s
?參數(shù)指定間隔時(shí)間?tail -f -s 4 xxx.log
touch
創(chuàng)建一個(gè)文件
touch new_file
mkdir
創(chuàng)建一個(gè)目錄
mkdir new_folder
【常用參數(shù)】
-p
?遞歸的創(chuàng)建目錄結(jié)構(gòu)?mkdir -p one/two/three
文件的復(fù)制和移動(dòng)
cp
拷貝文件和目錄
cp file file_copy --> file 是目標(biāo)文件,file_copy 是拷貝出來(lái)的文件cp file one --> 把 file 文件拷貝到 one 目錄下,并且文件名依然為 filecp file one/file_copy --> 把 file 文件拷貝到 one 目錄下,文件名為file_copycp *.txt folder --> 把當(dāng)前目錄下所有 txt 文件拷貝到 folder 目錄下
【常用參數(shù)】
-r
?遞歸的拷貝,常用來(lái)拷貝一整個(gè)目錄
mv
移動(dòng)(重命名)文件或目錄,與cp命令用法相似。
mv file one --> 將 file 文件移動(dòng)到 one 目錄下mv new_folder one --> 將 new_folder 文件夾移動(dòng)到one目錄下mv *.txt folder --> 把當(dāng)前目錄下所有 txt 文件移動(dòng)到 folder 目錄下mv file new_file --> file 文件重命名為 new_file
文件的刪除和鏈接
rm
刪除文件和目錄,由于?Linux
?下沒(méi)有回收站,一旦刪除非常難恢復(fù),因此需要謹(jǐn)慎操作
rm new_file ?--> 刪除 new_file 文件rm f1 f2 f3 ?--> 同時(shí)刪除 f1 f2 f3 3個(gè)文件
【常用參數(shù)】
-i
?向用戶確認(rèn)是否刪除;-f
?文件強(qiáng)制刪除;-r
?遞歸刪除文件夾,著名的刪除操作?rm -rf
?。
ln
英文?Link
?的縮寫(xiě),表示創(chuàng)建鏈接。
學(xué)習(xí)創(chuàng)建鏈接之前,首先要理解鏈接是什么,我們先來(lái)看看?Linux
?的文件是如何存儲(chǔ)的:
Linux
?文件的存儲(chǔ)方式分為3個(gè)部分,文件名、文件內(nèi)容以及權(quán)限,其中文件名的列表是存儲(chǔ)在硬盤的其它地方和文件內(nèi)容是分開(kāi)存放的,每個(gè)文件名通過(guò)?inode
?標(biāo)識(shí)綁定到文件內(nèi)容。
Linux 下有兩種鏈接類型:硬鏈接和軟鏈接。
硬鏈接
使鏈接的兩個(gè)文件共享同樣文件內(nèi)容,就是同樣的?inode
?,一旦文件1和文件2之間有了硬鏈接,那么修改任何一個(gè)文件,修改的都是同一塊內(nèi)容,它的缺點(diǎn)是,只能創(chuàng)建指向文件的硬鏈接,不能創(chuàng)建指向目錄的(其實(shí)也可以,但比較復(fù)雜)而軟鏈接都可以,因此軟鏈接使用更加廣泛。
ln file1 file2 ?--> 創(chuàng)建 file2 為 file1 的硬鏈接

如果我們用?rm file1
?來(lái)刪除?file1
?,對(duì)?file2
?沒(méi)有什么影響,對(duì)于硬鏈接來(lái)說(shuō),刪除任意一方的文件,共同指向的文件內(nèi)容并不會(huì)從硬盤上刪除。只有同時(shí)刪除了?file1
?與file2
?后,它們共同指向的文件內(nèi)容才會(huì)消失。
軟鏈接
軟鏈接就類似?windows
?下快捷方式。
ln -s file1 file2

執(zhí)行?ls -l
?命名查看當(dāng)前目錄下文件的具體信息
total 0-rw-r--r-- 1 root root 0 Jan 14 06:29 file1lrwxrwxrwx 1 root root 5 Jan 14 06:42 file2 -> file1 ?# 表示file2 指向 file1
其實(shí)?file2
?只是?file1
?的一個(gè)快捷方式,它指向的是?file1
?,所以顯示的是?file1
?的內(nèi)容,但其實(shí)?file2
?的?inode
?與?file1
?并不相同。如果我們刪除了?file2
?的話,?file1
是不會(huì)受影響的,但如果刪除?file1
?的話,?file2
?就會(huì)變成死鏈接,因?yàn)橹赶虻奈募灰?jiàn)了。
用戶與權(quán)限
用戶
Linux
?是一個(gè)多用戶的操作系統(tǒng)。在?Linux
?中,理論上來(lái)說(shuō),我們可以創(chuàng)建無(wú)數(shù)個(gè)用戶,但是這些用戶是被劃分到不同的群組里面的,有一個(gè)用戶,名叫?root
?,是一個(gè)很特殊的用戶,它是超級(jí)用戶,擁有最高權(quán)限。

自己創(chuàng)建的用戶是有限權(quán)限的用戶,這樣大大提高了?Linux
?系統(tǒng)的安全性,有效防止誤操作或是病毒攻擊,但是我們執(zhí)行的某些命令需要更高權(quán)限時(shí)可以使用?sudo
?命令。
sudo
以?root
?身份運(yùn)行命令
sudo date ?--> 當(dāng)然查看日期是不需要sudo的這里只是演示,sudo 完之后一般還需要輸入用戶密碼的
useradd + passwd
useradd
?添加新用戶passwd
?修改用戶密碼
這兩個(gè)命令需要?root
?用戶權(quán)限
useradd lion --> 添加一個(gè)lion用戶,添加完之后在 /home
路徑下可以查看passwd lion --> 修改lion用戶的密碼
userdel
刪除用戶,需要?root
?用戶權(quán)限
userdel lion --> 只會(huì)刪除用戶名,不會(huì)從/home中刪除對(duì)應(yīng)文件夾userdel
lion -r --> 會(huì)同時(shí)刪除/home下的對(duì)應(yīng)文件夾
su
切換用戶,需要?root
?用戶權(quán)限
sudo su --> 切換為root用戶(exit 命令或 CTRL + D 快捷鍵都可以使普通用戶切換為
root 用戶)su lion --> 切換為普通用戶su - --> 切換為root用戶
群組的管理
Linux
?中每個(gè)用戶都屬于一個(gè)特定的群組,如果你不設(shè)置用戶的群組,默認(rèn)會(huì)創(chuàng)建一個(gè)和它的用戶名一樣的群組,并且把用戶劃歸到這個(gè)群組。
groupadd
創(chuàng)建群組,用法和?useradd
?類似。
groupadd friends
groupdel
刪除一個(gè)已存在的群組
groupdel foo ?--> 刪除foo群組
groups
查看用戶所在群組
groups lion ?--> 查看 lion 用戶所在的群組
usermod
用于修改用戶的賬戶。
【常用參數(shù)】
-l
?對(duì)用戶重命名。需要注意的是?/home
?中的用戶家目錄的名字不會(huì)改變,需要手動(dòng)修改。-g
?修改用戶所在的群組,例如?usermod -g friends lion
修改?lion
?用戶的群組為?friends
?。-G
?一次性讓用戶添加多個(gè)群組,例如?usermod -G friends,foo,bar lion
?。-a
-G
?會(huì)讓你離開(kāi)原先的群組,如果你不想這樣做的話,就得再添加?-a
?參數(shù),意味著append
?追加的意思。
chgrp
用于修改文件的群組。
chgrp bar file.txt --> file.txt文件的群組修改為bar
chown
改變文件的所有者,需要?root
?身份才能運(yùn)行。
chown lion file.txt --> 把其它用戶創(chuàng)建的file.txt轉(zhuǎn)讓給lion用戶chown
lion:bar file.txt --> 把file.txt的用戶改為lion,群組改為bar
【常用參數(shù)】
-R
?遞歸設(shè)置子目錄和子文件,?chown -R lion:lion /home/frank
?把?frank
?文件夾的用戶和群組都改為?lion
?。
文件權(quán)限管理
chmod
修改訪問(wèn)權(quán)限。
chmod 740 file.txt
【常用參數(shù)】
-R
?可以遞歸地修改文件訪問(wèn)權(quán)限,例如?chmod -R 777 /home/lion
修改權(quán)限的確簡(jiǎn)單,但是理解其深層次的意義才是更加重要的。下面我們來(lái)系統(tǒng)的學(xué)習(xí)Linux
?的文件權(quán)限。
[root@lion ~]# ls -ldrwxr-xr-x 5 root root 4096 Apr 13 ?2020 climblrwxrwxrwx 1 root root ? ?7 Jan 14 06:41 hello2.c -> hello.c-rw-r--r-- 1 root root ?149 Jan 13 06:14 hello.c
其中?drwxr-xr-x
?表示文件或目錄的權(quán)限。讓我們一起來(lái)解讀它具體代表什么?
d
?:表示目錄,就是說(shuō)這是一個(gè)目錄,普通文件是?-
?,鏈接是?l
?。r
?:read
?表示文件可讀。w
?:write
?表示文件可寫(xiě),一般有寫(xiě)的權(quán)限,就有刪除的權(quán)限。x
?:execute
?表示文件可執(zhí)行。-
?:表示沒(méi)有相應(yīng)權(quán)限。
權(quán)限的整體是按用戶來(lái)劃分的,如下圖所示:

現(xiàn)在再來(lái)理解這句權(quán)限?drwxr-xr-x
?的意思:
它是一個(gè)文件夾;
它的所有者具有:讀、寫(xiě)、執(zhí)行權(quán)限;
它的群組用戶具有:讀、執(zhí)行的權(quán)限,沒(méi)有寫(xiě)的權(quán)限;
它的其它用戶具有:讀、執(zhí)行的權(quán)限,沒(méi)有寫(xiě)的權(quán)限。
現(xiàn)在理解了權(quán)限,我們使用?chmod
?來(lái)嘗試修改權(quán)限。chmod
?它不需要是?root
?用戶才能運(yùn)行的,只要你是此文件所有者,就可以用?chmod
?來(lái)修改文件的訪問(wèn)權(quán)限。
數(shù)字分配權(quán)限
因此要改變權(quán)限,只要做一些簡(jiǎn)單的加法就行:
chmod 640 hello.c # 分析6 = 4 + 2 + 0 表示所有者具有
rw 權(quán)限4 = 4 + 0 + 0 表示群組用戶具有 r 權(quán)限0 = 0 + 0 + 0 表示其它用戶沒(méi)有權(quán)限對(duì)應(yīng)文字權(quán)限為:
-rw-r-----
用字母來(lái)分配權(quán)限
u
?:user
?的縮寫(xiě),用戶的意思,表示所有者。g
?:group
?的縮寫(xiě),群組的意思,表示群組用戶。o
?:other
?的縮寫(xiě),其它的意思,表示其它用戶。a
?:all
?的縮寫(xiě),所有的意思,表示所有用戶。+
?:加號(hào),表示添加權(quán)限。-
?:減號(hào),表示去除權(quán)限。=
?:等于號(hào),表示分配權(quán)限。
chmod u+rx file --> 文件file的所有者增加讀和運(yùn)行的權(quán)限chmod g+r file -->
文件file的群組用戶增加讀的權(quán)限chmod o-r file -->
文件file的其它用戶移除讀的權(quán)限chmod g+r o-r file -->
文件file的群組用戶增加讀的權(quán)限,其它用戶移除讀的權(quán)限chmod go-r file -->
文件file的群組和其他用戶移除讀的權(quán)限chmod +x file -->
文件file的所有用戶增加運(yùn)行的權(quán)限chmod u=rwx,g=r,o=- file --> 文件file的所有者分配讀寫(xiě)和執(zhí)行的權(quán)限,
群組其它用戶分配讀的權(quán)限,其他用戶沒(méi)有任何權(quán)限
查找文件
locate
搜索包含關(guān)鍵字的所有文件和目錄。后接需要查找的文件名,也可以用正則表達(dá)式。
安裝 locate
yum -y install mlocate --> 安裝包updatedb --> 更新數(shù)據(jù)庫(kù)復(fù)制代碼locate file.txtlocate fil*.txt
[注意]?locate
?命令會(huì)去文件數(shù)據(jù)庫(kù)中查找命令,而不是全磁盤查找,因此剛創(chuàng)建的文件并不會(huì)更新到數(shù)據(jù)庫(kù)中,所以無(wú)法被查找到,可以執(zhí)行?updatedb
?命令去更新數(shù)據(jù)庫(kù)。
find
用于查找文件,它會(huì)去遍歷你的實(shí)際硬盤進(jìn)行查找,而且它允許我們對(duì)每個(gè)找到的文件進(jìn)行后續(xù)操作,功能非常強(qiáng)大。
find <何處> <何物> <做什么>
何處:指定在哪個(gè)目錄查找,此目錄的所有子目錄也會(huì)被查找。
何物:查找什么,可以根據(jù)文件的名字來(lái)查找,也可以根據(jù)其大小來(lái)查找,還可以根據(jù)其最近訪問(wèn)時(shí)間來(lái)查找。
做什么:找到文件后,可以進(jìn)行后續(xù)處理,如果不指定這個(gè)參數(shù),?
find
?命令只會(huì)顯示找到的文件。
根據(jù)文件名查找
find -name "file.txt" --> 當(dāng)前目錄以及子目錄下通過(guò)
名稱查找文件find . -name "syslog" --> 當(dāng)前目錄以及子目錄
下通過(guò)名稱查找文件find / -name "syslog" --> 整個(gè)硬
盤下查找syslogfind /var/log -name "syslog" --> 在指定的
目錄/var/log下查找syslog文件find /var/log -name "syslog
*" --> 查找syslog1、syslog2 ... 等文件,通配符表示所有find /va
r/log -name "*syslog*" --> 查找包含syslog的文件
[注意]?find
?命令只會(huì)查找完全符合 “何物” 字符串的文件,而?locate
?會(huì)查找所有包含關(guān)鍵字的文件。
根據(jù)文件大小查找
find /var -size +10M --> /var 目錄下查找文件大小超過(guò) 10M 的文件find /var -size -50k --> /var 目錄下查找文件大小小于 50k 的文件find /var -size +1G --> /var 目錄下查找文件大小查過(guò) 1G 的文件find /var -size 1M --> /var 目錄下查找文件大小等于 1M 的文件
根據(jù)文件最近訪問(wèn)時(shí)間查找
find -name "*.txt" -atime -7 ?--> 近 7天內(nèi)訪問(wèn)過(guò)的.txt結(jié)尾的文件
僅查找目錄或文件
find . -name "file" -type f ?--> 只查找當(dāng)前目錄下的file文件find . -name "file" -type d ?--> 只查找當(dāng)前目錄下的file目錄
操作查找結(jié)果
find -name "*.txt" -printf "%p - %u\n" --> 找出所有后綴為txt的文件,并按照 %p - %u\n 格式打印,其中%p=文件名,%u=文件所有者find -name "*.jpg" -delete --> 刪除當(dāng)前目錄以及子目錄下所有.jpg為后綴的文件,不會(huì)有刪除提示,因此要慎用find -name "*.c" -exec chmod 600 {} \; --> 對(duì)每個(gè).c結(jié)尾的文件,都進(jìn)行 -exec 參數(shù)指定的操作,{} 會(huì)被查找到的文件替代,\; 是必須的結(jié)尾find -name "*.c" -ok chmod 600 {} \; --> 和上面的功能一直,會(huì)多一個(gè)確認(rèn)提示
軟件倉(cāng)庫(kù)
Linux
?下軟件是以包的形式存在,一個(gè)軟件包其實(shí)就是軟件的所有文件的壓縮包,是二進(jìn)制的形式,包含了安裝軟件的所有指令。Red Hat
?家族的軟件包后綴名一般為?.rpm
?,Debian
?家族的軟件包后綴是?.deb
?。
Linux
?的包都存在一個(gè)倉(cāng)庫(kù),叫做軟件倉(cāng)庫(kù),它可以使用?yum
?來(lái)管理軟件包,?yum
?是?CentOS
?中默認(rèn)的包管理工具,適用于?Red Hat
?一族??梢岳斫獬?Node.js
?的?npm
?。
yum 常用命令
yum update | yum upgrade
?更新軟件包yum search xxx
?搜索相應(yīng)的軟件包yum install xxx
?安裝軟件包yum remove xxx
?刪除軟件包
切換 CentOS 軟件源
有時(shí)候?CentOS
?默認(rèn)的?yum
?源不一定是國(guó)內(nèi)鏡像,導(dǎo)致?yum
?在線安裝及更新速度不是很理想。這時(shí)候需要將?yum
?源設(shè)置為國(guó)內(nèi)鏡像站點(diǎn)。國(guó)內(nèi)主要開(kāi)源的鏡像站點(diǎn)是網(wǎng)易和阿里云。
1、首先備份系統(tǒng)自帶?yum
?源配置文件?mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
2、下載阿里云的?yum
?源配置文件到?/etc/yum.repos.d/CentOS7
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
3、生成緩存
yum makecache
閱讀手冊(cè)
Linux
?命令種類繁雜,我們憑借記憶不可能全部記住,因此學(xué)會(huì)查用手冊(cè)是非常重要的。
man
安裝更新 man
sudo yum install -y man-pages --> 安裝sudo mandb --> 更新
man 手冊(cè)種類
可執(zhí)行程序或?
Shell
?命令;系統(tǒng)調(diào)用(?
Linux
?內(nèi)核提供的函數(shù));庫(kù)調(diào)用(程序庫(kù)中的函數(shù));
文件(例如?
/etc/passwd
?);特殊文件(通常在?
/dev
?下);游戲;
雜項(xiàng)(?
man(7)
?,groff(7)
?);系統(tǒng)管理命令(通常只能被?
root
?用戶使用);內(nèi)核子程序。
man + 數(shù)字 + 命令
輸入 man + 數(shù)字 + 命令/函數(shù),可以查到相關(guān)的命令和函數(shù),若不加數(shù)字,?man
?默認(rèn)從數(shù)字較小的手冊(cè)中尋找相關(guān)命令和函數(shù)
man 3 rand ?--> 表示在手冊(cè)的第三部分查找 rand 函數(shù)man ls ? ?--> 查找 ls 用法手冊(cè)
man 手冊(cè)核心區(qū)域解析:(以?man pwd
?為例)
NAME # 命令名稱和簡(jiǎn)單描述 ? ? pwd -- return working directory nameSYNOPSIS # 使用此命令的所有方法 ? ? pwd [-L | -P]DESCRIPTION # 包括所有參數(shù)以及用法 ? ? The pwd utility writes the absolute pathname of the current working directory to the standard output. ? ? Some shells may provide a builtin pwd command which is similar or identical to this utility. ?Consult the builtin(1) manual page. ? ? The options are as follows: ? ? -L ? ? ?Display the logical current working directory. ? ? -P ? ? ?Display the physical current working directory (all symbolic links resolved). ? ? If no options are specified, the -L option is assumed.SEE ALSO # 擴(kuò)展閱讀相關(guān)命令 ? ? builtin(1), cd(1), csh(1), sh(1), getcwd(3)
help
man
?命令像新華詞典一樣可以查詢到命令或函數(shù)的詳細(xì)信息,但其實(shí)我們還有更加快捷的方式去查詢,?command --help
?或?command -h
?,它沒(méi)有?man
?命令顯示的那么詳細(xì),但是它更加易于閱讀。
Linux 進(jìn)階
文本操作
grep
全局搜索一個(gè)正則表達(dá)式,并且打印到屏幕。簡(jiǎn)單來(lái)說(shuō)就是,在文件中查找關(guān)鍵字,并顯示關(guān)鍵字所在行。
基礎(chǔ)語(yǔ)法
grep text file # text代表要搜索的文本,file代表供搜索的文件# 實(shí)例[root@lion ~]# grep path /etc/profilepathmunge () { ? ?pathmunge /usr/sbin ? ?pathmunge /usr/local/sbin ? ?pathmunge /usr/local/sbin after ? ?pathmunge /usr/sbin afterunset -f pathmunge
常用參數(shù)
-i
?忽略大小寫(xiě),?grep -i path /etc/profile
-n
?顯示行號(hào),grep -n path /etc/profile
-v
?只顯示搜索文本不在的那些行,grep -v path /etc/profile
-r
?遞歸查找,?grep -r hello /etc
?,Linux 中還有一個(gè) rgrep 命令,作用相當(dāng)于?grep -r
高級(jí)用法
grep
?可以配合正則表達(dá)式使用。
grep -E path /etc/profile --> 完全匹配pathgrep -E ^path /etc/profile --> 匹配path開(kāi)頭的字符串grep -E [Pp]ath /etc/profile --> 匹配path或Path
sort
對(duì)文件的行進(jìn)行排序。
基礎(chǔ)語(yǔ)法
sort name.txt # 對(duì)name.txt文件進(jìn)行排序
實(shí)例用法
為了演示方便,我們首先創(chuàng)建一個(gè)文件?name.txt
?,放入以下內(nèi)容:
ChristopherShawnTedRockNoahZacharyBella
執(zhí)行?sort name.txt
?命令,會(huì)對(duì)文本內(nèi)容進(jìn)行排序。
常用參數(shù)
-o
?將排序后的文件寫(xiě)入新文件,?sort -o name_sorted.txt name.txt
?;-r
?倒序排序,?sort -r name.txt
?;-R
?隨機(jī)排序,?sort -R name.txt
?;-n
?對(duì)數(shù)字進(jìn)行排序,默認(rèn)是把數(shù)字識(shí)別成字符串的,因此 138 會(huì)排在 25 前面,如果添加了?-n
?數(shù)字排序的話,則 25 會(huì)在 138 前面。
wc
word count
?的縮寫(xiě),用于文件的統(tǒng)計(jì)。它可以統(tǒng)計(jì)單詞數(shù)目、行數(shù)、字符數(shù),字節(jié)數(shù)等。
基礎(chǔ)語(yǔ)法
wc name.txt # 統(tǒng)計(jì)name.txt
實(shí)例用法
[root@lion ~]# wc name.txt 13 13 91 name.txt
第一個(gè)13,表示行數(shù);
第二個(gè)13,表示單詞數(shù);
第三個(gè)91,表示字節(jié)數(shù)。
常用參數(shù)
-l
?只統(tǒng)計(jì)行數(shù),?wc -l name.txt
?;-w
?只統(tǒng)計(jì)單詞數(shù),?wc -w name.txt
?;-c
?只統(tǒng)計(jì)字節(jié)數(shù),?wc -c name.txt
?;-m
?只統(tǒng)計(jì)字符數(shù),?wc -m name.txt
?。
uniq
刪除文件中的重復(fù)內(nèi)容。
基礎(chǔ)語(yǔ)法
uniq name.txt # 去除name.txt重復(fù)的行數(shù),并打印到屏幕上uniq name.txt uniq_name.txt # 把去除重復(fù)后的文件保存為 uniq_name.txt
【注意】它只能去除連續(xù)重復(fù)的行數(shù)。
常用參數(shù)
-c
?統(tǒng)計(jì)重復(fù)行數(shù),?uniq -c name.txt
?;-d
?只顯示重復(fù)的行數(shù),?uniq -d name.txt
?。
cut
剪切文件的一部分內(nèi)容。
基礎(chǔ)語(yǔ)法
cut -c 2-4 name.txt # 剪切每一行第二到第四個(gè)字符
常用參數(shù)
-d
?用于指定用什么分隔符(比如逗號(hào)、分號(hào)、雙引號(hào)等等)?cut -d , name.txt
?;-f
?表示剪切下用分隔符分割的哪一塊或哪幾塊區(qū)域,?cut -d , -f 1 name.txt
?。
重定向 管道 流
在?Linux
?中一個(gè)命令的去向可以有3個(gè)地方:終端、文件、作為另外一個(gè)命令的入?yún)ⅰ?/p>
命令一般都是通過(guò)鍵盤輸入,然后輸出到終端、文件等地方,它的標(biāo)準(zhǔn)用語(yǔ)是?stdin
?、?stdout
?以及?stderr
?。
標(biāo)準(zhǔn)輸入?
stdin
?,終端接收鍵盤輸入的命令,會(huì)產(chǎn)生兩種輸出;標(biāo)準(zhǔn)輸出?
stdout
?,終端輸出的信息(不包含錯(cuò)誤信息);標(biāo)準(zhǔn)錯(cuò)誤輸出?
stderr
?,終端輸出的錯(cuò)誤信息。

重定向
把本來(lái)要顯示在終端的命令結(jié)果,輸送到別的地方(到文件中或者作為其他命令的輸入)。
輸出重定向?>
>
?表示重定向到新的文件,?cut -d , -f 1 notes.csv > name.csv
?,它表示通過(guò)逗號(hào)剪切notes.csv
?文件(剪切完有3個(gè)部分)獲取第一個(gè)部分,重定向到?name.csv
?文件。
我們來(lái)看一個(gè)具體示例,學(xué)習(xí)它的使用,假設(shè)我們有一個(gè)文件?notes.csv
?,文件內(nèi)容如下:
Mark1,951/100,很不錯(cuò)1Mark2,952/100,很不錯(cuò)2Mark3,953/100,很不錯(cuò)3Mark4,954/100,很不錯(cuò)4Mark5,955/100,很不錯(cuò)5Mark6,956/100,很不錯(cuò)6
執(zhí)行命令:cut -d , -f 1 notes.csv > name.csv
?最后輸出如下內(nèi)容:
Mark1Mark2Mark3Mark4Mark5Mark6
【注意】使用?>
?要注意,如果輸出的文件不存在它會(huì)新建一個(gè),如果輸出的文件已經(jīng)存在,則會(huì)覆蓋。因此執(zhí)行這個(gè)操作要非常小心,以免覆蓋其它重要文件。
輸出重定向?>>
表示重定向到文件末尾,因此它不會(huì)像?>
?命令這么危險(xiǎn),它是追加到文件的末尾(當(dāng)然如果文件不存在,也會(huì)被創(chuàng)建)。
再次執(zhí)行?cut -d , -f 1 notes.csv >> name.csv
?,則會(huì)把名字追加到?name.csv
?里面。
Mark1Mark2Mark3Mark4Mark5Mark6Mark1Mark2Mark3Mark4Mark5Mark6
我們平時(shí)讀的?log
?日志文件其實(shí)都是用這個(gè)命令輸出的。
輸出重定向?2>
標(biāo)準(zhǔn)錯(cuò)誤輸出
cat not_exist_file.csv > res.txt 2> errors.log
當(dāng)我們?
cat
?一個(gè)文件時(shí),會(huì)把文件內(nèi)容打印到屏幕上,這個(gè)是標(biāo)準(zhǔn)輸出;當(dāng)使用了?
> res.txt
?時(shí),則不會(huì)打印到屏幕,會(huì)把標(biāo)準(zhǔn)輸出寫(xiě)入文件?res.txt
?文件中;2> errors.log
?當(dāng)發(fā)生錯(cuò)誤時(shí)會(huì)寫(xiě)入?errors.log
?文件中。
輸出重定向?2>>
標(biāo)準(zhǔn)錯(cuò)誤輸出(追加到文件末尾)同?>>
?相似。
輸出重定向?2>&1
標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出都重定向都一個(gè)地方
cat not_exist_file.csv > res.txt 2>&1 ?# 覆蓋輸出cat not_exist_file.csv >> res.txt 2>&1 # 追加輸出
目前為止,我們接觸的命令的輸入都來(lái)自命令的參數(shù),其實(shí)命令的輸入還可以來(lái)自文件或者鍵盤的輸入。

輸入重定向?<
<
?符號(hào)用于指定命令的輸入。
cat < name.csv # 指定命令的輸入為 name.csv
雖然它的運(yùn)行結(jié)果與?cat name.csv
?一樣,但是它們的原理卻完全不同。
cat name.csv
?表示?cat
?命令接收的輸入是?notes.csv
?文件名,那么要先打開(kāi)這個(gè)文件,然后打印出文件內(nèi)容。cat < name.csv
?表示?cat
?命令接收的輸入直接是?notes.csv
?這個(gè)文件的內(nèi)容,?cat
命令只負(fù)責(zé)將其內(nèi)容打印,打開(kāi)文件并將文件內(nèi)容傳遞給?cat
?命令的工作則交給終端完成。
輸入重定向?<<
將鍵盤的輸入重定向?yàn)槟硞€(gè)命令的輸入。
sort -n << END # 輸入這個(gè)命令之后,按下回車,終端就進(jìn)入鍵盤輸入模式,其中END為結(jié)束命令(這個(gè)可以自定義)wc -m << END # 統(tǒng)計(jì)輸入的單詞
管道?|
把兩個(gè)命令連起來(lái)使用,一個(gè)命令的輸出作為另外一個(gè)命令的輸入,英文是?pipeline
?,可以想象一個(gè)個(gè)水管連接起來(lái),管道算是重定向流的一種。

舉幾個(gè)實(shí)際用法案例:
cut -d , -f 1 name.csv | sort > sorted_name.txt # 第一步獲取到的 name 列表,通過(guò)管道符再進(jìn)行排序,最后輸出到sorted_name.txtdu | sort -nr | head # du 表示列舉目錄大小信息# sort 進(jìn)行排序,-n 表示按數(shù)字排序,-r 表示倒序# head 前10行文件grep log -Ir /var/log | cut -d : -f 1 | sort | uniq# grep log -Ir /var/log 表示在log文件夾下搜索 /var/log 文本,-r 表示遞歸,-I 用于排除二進(jìn)制文件# cut -d : -f 1 表示通過(guò)冒號(hào)進(jìn)行剪切,獲取剪切的第一部分# sort 進(jìn)行排序# uniq 進(jìn)行去重
流
流并非一個(gè)命令,在計(jì)算機(jī)科學(xué)中,流?stream
?的含義是比較難理解的,記住一點(diǎn)即可:流就是讀一點(diǎn)數(shù)據(jù), 處理一點(diǎn)點(diǎn)數(shù)據(jù)。其中數(shù)據(jù)一般就是二進(jìn)制格式。?上面提及的重定向或管道,就是把數(shù)據(jù)當(dāng)做流去運(yùn)轉(zhuǎn)的。
到此我們就接觸了,流、重定向、管道等?Linux
?高級(jí)概念及指令。其實(shí)你會(huì)發(fā)現(xiàn)關(guān)于流和管道在其它語(yǔ)言中也有廣泛的應(yīng)用。Angular
?中的模板語(yǔ)法中可以使用管道。Node.js
?中也有stream
?流的概念。
查看進(jìn)程
在?Windows
?中通過(guò)?Ctrl + Alt + Delete
?快捷鍵查看軟件進(jìn)程。
w
幫助我們快速了解系統(tǒng)中目前有哪些用戶登錄著,以及他們?cè)诟墒裁础?/p>
[root@lion ~]# w 06:31:53 up 25 days, ?9:53, ?1 user, ?load average: 0.00, 0.01, 0.05USER ? ? TTY ? ? ?FROM ? ? ? ? ? ? LOGIN@ ? IDLE ? JCPU ? PCPU WHATroot ? ? pts/0 ? ?118.31.243.53 ? ?05:56 ? ?1.00s ?0.02s ?0.00s w 06:31:53:表示當(dāng)前時(shí)間up 25 days, 9:53:表示系統(tǒng)已經(jīng)正常運(yùn)行了“25天9小時(shí)53分鐘”1 user:表示一個(gè)用戶load average: 0.00, 0.01, 0.05:表示系統(tǒng)的負(fù)載,3個(gè)值分別表示“1分鐘的平均負(fù)載”,“5分鐘的平均負(fù)載”,“15分鐘的平均負(fù)載” USER:表示登錄的用于 TTY:登錄的終端名稱為pts/0 FROM:連接到服務(wù)器的ip地址 LOGIN@:登錄時(shí)間 IDLE:用戶有多久沒(méi)有活躍了 JCPU:該終端所有相關(guān)的進(jìn)程使用的 CPU 時(shí)間,每當(dāng)進(jìn)程結(jié)束就停止計(jì)時(shí),開(kāi)始新的進(jìn)程則會(huì)重新計(jì)時(shí) PCPU:表示 CPU 執(zhí)行當(dāng)前程序所消耗的時(shí)間,當(dāng)前進(jìn)程就是在 WHAT 列里顯示的程序 WHAT:表示當(dāng)下用戶正運(yùn)行的程序是什么,這里我運(yùn)行的是 w
ps
用于顯示當(dāng)前系統(tǒng)中的進(jìn)程,?ps
?命令顯示的進(jìn)程列表不會(huì)隨時(shí)間而更新,是靜態(tài)的,是運(yùn)行?ps
?命令那個(gè)時(shí)刻的狀態(tài)或者說(shuō)是一個(gè)進(jìn)程快照。
基礎(chǔ)語(yǔ)法
[root@lion ~]# ps ?PID TTY ? ? ? ? ?TIME CMD 1793 pts/0 ? ?00:00:00 bash 4756 pts/0 ? ?00:00:00 ps ?PID:進(jìn)程號(hào),每個(gè)進(jìn)程都有唯一的進(jìn)程號(hào) TTY:進(jìn)程運(yùn)行所在的終端 TIME:進(jìn)程運(yùn)行時(shí)間 CMD:產(chǎn)生這個(gè)進(jìn)程的程序名,如果在進(jìn)程列表中看到有好幾行都是同樣的程序名,那么就是同樣的程序產(chǎn)生了不止一個(gè)進(jìn)
常用參數(shù)
-ef
?列出所有進(jìn)程;-efH
?以喬木狀列舉出所有進(jìn)程;-u
?列出此用戶運(yùn)行的進(jìn)程;-aux
?通過(guò)?CPU
?和內(nèi)存使用來(lái)過(guò)濾進(jìn)程?ps -aux | less
?;-aux --sort -pcpu
?按?CPU
?使用降序排列,?-aux --sort -pmem
?表示按內(nèi)存使用降序排列;-axjf
?以樹(shù)形結(jié)構(gòu)顯示進(jìn)程,?ps -axjf
?它和?pstree
?效果類似。
top
獲取進(jìn)程的動(dòng)態(tài)列表。
top - 07:20:07 up 25 days, 10:41, ?1 user, ?load average: 0.30, 0.10, 0.07Tasks: ?67 total, ? 1 running, ?66 sleeping, ? 0 stopped, ? 0 zombie%Cpu(s): ?0.7 us, ?0.3 sy, ?0.0 ni, 99.0 id, ?0.0 wa, ?0.0 hi, ?0.0 si, ?0.0 stKiB Mem : ?1882072 total, ? 552148 free, ? 101048 used, ?1228876 buff/cacheKiB Swap: ? ? ? ?0 total, ? ? ? ?0 free, ? ? ? ?0 used. ?1594080 avail Mem ? PID USER ? ? ?PR ?NI ? ?VIRT ? ?RES ? ?SHR S %CPU %MEM ? ? TIME+ COMMAND ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 956 root ? ? ?10 -10 ?133964 ?15848 ?10240 S ?0.7 ?0.8 263:13.01 AliYunDun ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1 root ? ? ?20 ? 0 ? 51644 ? 3664 ? 2400 S ?0.0 ?0.2 ? 3:23.63 systemd ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2 root ? ? ?20 ? 0 ? ? ? 0 ? ? ?0 ? ? ?0 S ?0.0 ?0.0 ? 0:00.05 kthreadd ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?4 root ? ? ? 0 -20 ? ? ? 0 ? ? ?0 ? ? ?0 S ?0.0 ?0.0 ? 0:00.00 kworker/0:0H ? ?
top - 07:20:07 up 25 days, 10:41, 1 user, load average: 0.30, 0.10, 0.07
?相當(dāng)?w
命令的第一行的信息。展示的這些進(jìn)程是按照使用處理器?
%CPU
?的使用率來(lái)排序的。
kill
結(jié)束一個(gè)進(jìn)程,?kill + PID
?。
kill 956 # 結(jié)束進(jìn)程號(hào)為956的進(jìn)程kill 956 957 # 結(jié)束多個(gè)進(jìn)程kill -9 7291 # 強(qiáng)制結(jié)束進(jìn)程
管理進(jìn)程
進(jìn)程狀態(tài)
主要是切換進(jìn)程的狀態(tài)。我們先了解下?Linux
?下進(jìn)程的五種狀態(tài):
狀態(tài)碼?
R
?:表示正在運(yùn)行的狀態(tài);狀態(tài)碼?
S
?:表示中斷(休眠中,受阻,當(dāng)某個(gè)條件形成后或接受到信號(hào)時(shí),則脫離該狀態(tài));狀態(tài)碼?
D
?:表示不可中斷(進(jìn)程不響應(yīng)系統(tǒng)異步信號(hào),即使用kill命令也不能使其中斷);狀態(tài)碼?
Z
?:表示僵死(進(jìn)程已終止,但進(jìn)程描述符依然存在,直到父進(jìn)程調(diào)用?wait4()
系統(tǒng)函數(shù)后將進(jìn)程釋放);狀態(tài)碼?
T
?:表示停止(進(jìn)程收到?SIGSTOP
?、?SIGSTP
?、?SIGTIN
?、?SIGTOU
?等停止信號(hào)后停止運(yùn)行)。
前臺(tái)進(jìn)程 & 后臺(tái)進(jìn)程
默認(rèn)情況下,用戶創(chuàng)建的進(jìn)程都是前臺(tái)進(jìn)程,前臺(tái)進(jìn)程從鍵盤讀取數(shù)據(jù),并把處理結(jié)果輸出到顯示器。例如運(yùn)行?top
?命令,這就是一個(gè)一直運(yùn)行的前臺(tái)進(jìn)程。
后臺(tái)進(jìn)程的優(yōu)點(diǎn)是不必等待程序運(yùn)行結(jié)束,就可以輸入其它命令。在需要執(zhí)行的命令后面添加&
?符號(hào),就表示啟動(dòng)一個(gè)后臺(tái)進(jìn)程。
&
啟動(dòng)后臺(tái)進(jìn)程,它的缺點(diǎn)是后臺(tái)進(jìn)程與終端相關(guān)聯(lián),一旦關(guān)閉終端,進(jìn)程就自動(dòng)結(jié)束了。
cp name.csv name-copy.csv &
nohup
使進(jìn)程不受掛斷(關(guān)閉終端等動(dòng)作)的影響。
nohup cp name.csv name-copy.csv
nohup
?命令也可以和?&
?結(jié)合使用。
nohup cp name.csv name-copy.csv &
bg
使一個(gè)“后臺(tái)暫停運(yùn)行”的進(jìn)程,狀態(tài)改為“后臺(tái)運(yùn)行”。
bg %1 # 不加任何參數(shù)的情況下,bg命令會(huì)默認(rèn)作用于最近的一個(gè)后臺(tái)進(jìn)程,如果添加參數(shù)則會(huì)作用于指定標(biāo)號(hào)的進(jìn)程
實(shí)際案例1:
1. 執(zhí)行 grep -r "log" / > grep_log 2>&1 命令啟動(dòng)一個(gè)前臺(tái)進(jìn)程,并且忘記添加 & 符號(hào)2. ctrl + z 使進(jìn)程狀態(tài)轉(zhuǎn)為后臺(tái)暫停3. 執(zhí)行 bg 將命令轉(zhuǎn)為后臺(tái)運(yùn)行
實(shí)際案例2:
前端開(kāi)發(fā)時(shí)我們經(jīng)常會(huì)執(zhí)行 yarn start 啟動(dòng)項(xiàng)目此時(shí)我們執(zhí)行 ctrl + z 先使其暫停然后執(zhí)行 bg 使其轉(zhuǎn)為后臺(tái)運(yùn)行這樣當(dāng)前終端就空閑出來(lái)可以干其它事情了,如果想要喚醒它就使用 fg 命令即可(后面會(huì)講)
jobs
顯示當(dāng)前終端后臺(tái)進(jìn)程狀態(tài)。
[root@lion ~]# jobs[1]+ ?Stopped ? ? ? ? ? ? ? ? top[2]- ?Running ? ? ? ? ? ? ? ? grep --color=auto -r "log" / > grep_log 2>&1 &
fg
fg
?使進(jìn)程轉(zhuǎn)為前臺(tái)運(yùn)行,用法和?bg
?命令類似。
我們用一張圖來(lái)表示前后臺(tái)進(jìn)程切換:

我們可以使程序在后臺(tái)運(yùn)行,成為后臺(tái)進(jìn)程,這樣在當(dāng)前終端中我們就可以做其他事情了,而不必等待此進(jìn)程運(yùn)行結(jié)束。
守護(hù)進(jìn)程
一個(gè)運(yùn)行起來(lái)的程序被稱為進(jìn)程。在?Linux
?中有些進(jìn)程是特殊的,它不與任何進(jìn)程關(guān)聯(lián),不論用戶的身份如何,都在后臺(tái)運(yùn)行,這些進(jìn)程的父進(jìn)程是?PID
?為1的進(jìn)程,?PID
?為1的進(jìn)程只在系統(tǒng)關(guān)閉時(shí)才會(huì)被銷毀。它們會(huì)在后臺(tái)一直運(yùn)行等待分配工作。我們將這類進(jìn)程稱之為守護(hù)進(jìn)程?daemon
?。
守護(hù)進(jìn)程的名字通常會(huì)在最后有一個(gè)?d
?,表示?daemon
?守護(hù)的意思,例如?systemd
、httpd
?。
systemd
systemd
?是一個(gè)?Linux
?系統(tǒng)基礎(chǔ)組件的集合,提供了一個(gè)系統(tǒng)和服務(wù)管理器,運(yùn)行為?PID 1
?并負(fù)責(zé)啟動(dòng)其它程序。
[root@lion ~]# ps -auxUSER ? ? ? PID %CPU %MEM ? ?VSZ ? RSS TTY ? ? ?STAT START ? TIME COMMANDroot ? ? ? ? 1 ?0.0 ?0.2 ?51648 ?3852 ? ? ? ? ?Ss ? Feb01 ? 1:50 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
通過(guò)命令也可以看到?PID
?為1的進(jìn)程就是?systemd
?的系統(tǒng)進(jìn)程。
systemd
?常用命令(它是一組命令的集合):
systemctl start nginx # 啟動(dòng)服務(wù)systemctl stop nginx # 停止服務(wù)systemctl restart nginx # 重啟服務(wù)systemctl status nginx # 查看服務(wù)狀態(tài)systemctl reload nginx # 重載配置文件(不停止服務(wù)的情況)systemctl enable nginx # 開(kāi)機(jī)自動(dòng)啟動(dòng)服務(wù)systemctl disable nginx # 開(kāi)機(jī)不自動(dòng)啟動(dòng)服務(wù)systemctl is-enabled nginx # 查看服務(wù)是否開(kāi)機(jī)自動(dòng)啟動(dòng)systemctl list-unit-files --type=service # 查看各個(gè)級(jí)別下服務(wù)的啟動(dòng)和禁用情
文件壓縮解壓
打包:是將多個(gè)文件變成一個(gè)總的文件,它的學(xué)名叫存檔、歸檔。
壓縮:是將一個(gè)大文件(通常指歸檔)壓縮變成一個(gè)小文件。
我們常常使用?tar
?將多個(gè)文件歸檔為一個(gè)總的文件,稱為?archive
?。然后用?gzip
?或?bzip2
?命令將?archive
?壓縮為更小的文件。

tar
創(chuàng)建一個(gè)?tar
?歸檔。
基礎(chǔ)用法
tar -cvf sort.tar sort/ # 將sort文件夾歸檔為sort.tartar -cvf archive.tar file1 file2 file3 # 將 file1 file2 file3 歸檔為archive.ta
常用參數(shù)
-cvf
?表示?create
(創(chuàng)建)+?verbose
(細(xì)節(jié))+?file
(文件),創(chuàng)建歸檔文件并顯示操作細(xì)節(jié);-tf
?顯示歸檔里的內(nèi)容,并不解開(kāi)歸檔;-rvf
?追加文件到歸檔,?tar -rvf archive.tar file.txt
?;-xvf
?解開(kāi)歸檔,?tar -xvf archive.tar
?。
gzip / gunzip
“壓縮/解壓”歸檔,默認(rèn)用?gzip
?命令,壓縮后的文件后綴名為?.tar.gz
?。
gzip archive.tar # 壓縮gunzip archive.tar.gz # 解壓
tar 歸檔+壓縮
可以用?tar
?命令同時(shí)完成歸檔和壓縮的操作,就是給?tar
?命令多加一個(gè)選項(xiàng)參數(shù),使之完成歸檔操作后,還是調(diào)用?gzip
?或?bzip2
?命令來(lái)完成壓縮操作。
tar -zcvf archive.tar.gz archive/ # 將archive文件夾歸檔并壓縮tar -zxvf archive.tar.gz # 將archive.tar.gz歸檔壓縮文件解壓
zcat、zless、zmore
之前講過(guò)使用?cat less more
?可以查看文件內(nèi)容,但是壓縮文件的內(nèi)容是不能使用這些命令進(jìn)行查看的,而要使用?zcat、zless、zmore
?進(jìn)行查看。
zcat archive.tar.gz
zip/unzip
“壓縮/解壓”?zip
?文件(?zip
?壓縮文件一般來(lái)自?windows
?操作系統(tǒng))。
命令安裝
# Red Hat 一族中的安裝方式y(tǒng)um install zip yum install unzip
基礎(chǔ)用法
unzip archive.zip # 解壓 .zip 文件unzip -l archive.zip # 不解開(kāi) .zip 文件,只看其中內(nèi)容zip -r sort.zip sort/ # 將sort文件夾壓縮為 sort.zip,其中-r表示遞歸
編譯安裝軟件
之前我們學(xué)會(huì)了使用?yum
?命令進(jìn)行軟件安裝,如果碰到?yum
?倉(cāng)庫(kù)中沒(méi)有的軟件,我們就需要會(huì)更高級(jí)的軟件安裝“源碼編譯安裝”。
編譯安裝
簡(jiǎn)單來(lái)說(shuō),編譯就是將程序的源代碼轉(zhuǎn)換成可執(zhí)行文件的過(guò)程。大多數(shù)?Linux
?的程序都是開(kāi)放源碼的,可以編譯成適合我們的電腦和操縱系統(tǒng)屬性的可執(zhí)行文件。
基本步驟如下:
下載源代碼
解壓壓縮包
配置
編譯
安裝
實(shí)際案例
1、下載
我們來(lái)編譯安裝?htop
?軟件,首先在它的官網(wǎng)下載源碼:http://bintray.com/htop/source…[1]
下載好的源碼在本機(jī)電腦上使用如下命令同步到服務(wù)器上:
scp 文件名 用戶名@服務(wù)器ip:目標(biāo)路徑scp ~/Desktop/htop-3.0.0.tar.gz root@121.42.11.34:.
也可以使用?wegt
?進(jìn)行下載:
wegt+下載地址wegt https://bintray.com/htop/source/download_file?file_path=htop-3.0.0.tar.gz
2、解壓文件
tar -zxvf htop-3.0.0.tar.gz # 解壓cd htop-3.0.0 # 進(jìn)入目錄
3、配置
執(zhí)行?./configure
?,它會(huì)分析你的電腦去確認(rèn)編譯所需的工具是否都已經(jīng)安裝了。
4、編譯
執(zhí)行?make
?命令
5、安裝
執(zhí)行?make install
?命令,安裝完成后執(zhí)行?ls /usr/local/bin/
?查看是否有?htop
?命令。如果有就可以執(zhí)行?htop
?命令查看系統(tǒng)進(jìn)程了。
網(wǎng)絡(luò)
ifconfig
查看?ip
?網(wǎng)絡(luò)相關(guān)信息,如果命令不存在的話, 執(zhí)行命令?yum install net-tools
?安裝。
[root@lion ~]# ifconfigeth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> ?mtu 1500 ? ? ? ?inet 172.31.24.78 ?netmask 255.255.240.0 ?broadcast 172.31.31.255 ? ? ? ?ether 00:16:3e:04:9c:cd ?txqueuelen 1000 ?(Ethernet) ? ? ? ?RX packets 1592318 ?bytes 183722250 (175.2 MiB) ? ? ? ?RX errors 0 ?dropped 0 ?overruns 0 ?frame 0 ? ? ? ?TX packets 1539361 ?bytes 154044090 (146.9 MiB) ? ? ? ?TX errors 0 ?dropped 0 overruns 0 ?carrier 0 ?collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> ?mtu 65536 ? ? ? ?inet 127.0.0.1 ?netmask 255.0.0.0 ? ? ? ?loop ?txqueuelen 1000 ?(Local Loopback) ? ? ? ?RX packets 0 ?bytes 0 (0.0 B) ? ? ? ?RX errors 0 ?dropped 0 ?overruns 0 ?frame 0 ? ? ? ?TX packets 0 ?bytes 0 (0.0 B) ? ? ? ?TX errors 0 ?dropped 0 overruns 0 ?carrier 0 ?collisions 0
參數(shù)解析:
eth0
?對(duì)應(yīng)有線連接(對(duì)應(yīng)你的有線網(wǎng)卡),就是用網(wǎng)線來(lái)連接的上網(wǎng)。eth
?是?Ethernet
?的縮寫(xiě),表示“以太網(wǎng)”。有些電腦可能同時(shí)有好幾條網(wǎng)線連著,例如服務(wù)器,那么除了eht0
?,你還會(huì)看到?eth1
?、?eth2
?等。lo
?表示本地回環(huán)(?Local Loopback
?的縮寫(xiě),對(duì)應(yīng)一個(gè)虛擬網(wǎng)卡)可以看到它的?ip
?地址是?127.0.0.1
?。每臺(tái)電腦都應(yīng)該有這個(gè)接口,因?yàn)樗鼘?duì)應(yīng)著“連向自己的鏈接”。這也是被稱之為“本地回環(huán)”的原因。所有經(jīng)由這個(gè)接口發(fā)送的東西都會(huì)回到你自己的電腦??雌饋?lái)好像并沒(méi)有什么用,但有時(shí)為了某些緣故,我們需要連接自己。例如用來(lái)測(cè)試一個(gè)網(wǎng)絡(luò)程序,但又不想讓局域網(wǎng)或外網(wǎng)的用戶查看,只能在此臺(tái)主機(jī)上運(yùn)行和查看所有的網(wǎng)絡(luò)接口。例如在我們啟動(dòng)一個(gè)前端工程時(shí),在瀏覽器輸入?127.0.0.1:3000
?啟動(dòng)項(xiàng)目就能查看到自己的?web
?網(wǎng)站,并且它只有你能看到。wlan0
?表示無(wú)線局域網(wǎng)(上面案例并未展示)。
host
ip
?地址和主機(jī)名的互相轉(zhuǎn)換。
軟件安裝
yum install bind-utils
基礎(chǔ)用法
[root@lion ~]# host github.combaidu.com has address 13.229.188.59 [root@lion ~]# host 13.229.188.5959.188.229.13.in-addr.arpa domain name pointer ec2-13-229-188-59.ap-southeast-1.compute.amazonaws.com.
ssh 連接遠(yuǎn)程服務(wù)器
通過(guò)非對(duì)稱加密以及對(duì)稱加密的方式(同?HTTPS
?安全連接原理相似)連接到遠(yuǎn)端服務(wù)器。
ssh 用戶@ip:port1、ssh root@172.20.10.1:22 # 端口號(hào)可以省略不寫(xiě),默認(rèn)是22端口2、輸入連接密碼后就可以操作遠(yuǎn)端服務(wù)器
配置 ssh
config
?文件可以配置?ssh
?,方便批量管理多個(gè)?ssh
?連接。
配置文件分為以下幾種:
全局?
ssh
?服務(wù)端的配置:/etc/ssh/sshd_config
?;全局?
ssh
?客戶端的配置:/etc/ssh/ssh_config
(很少修改);當(dāng)前用戶?
ssh
?客戶端的配置:~/.ssh/config
?。
【服務(wù)端?config
?文件的常用配置參數(shù)】
[注意] 修改完服務(wù)端配置文件需要重啟服務(wù)?systemctl restart sshd
【客戶端?config
?文件的常用配置參數(shù)】
配置當(dāng)前用戶的?config
?:
# 創(chuàng)建configvim ~/.ssh/config# 填寫(xiě)一下內(nèi)容Host lion # 別名 HostName 172.x.x.x # ip 地址 ?Port 22 # 端口 ?User root # 用戶
這樣配置完成后,下次登錄時(shí),可以這樣登錄?ssh lion
?會(huì)自動(dòng)識(shí)別為?root
?用戶。
[注意] 這段配置不是在服務(wù)器上,而是你自己的機(jī)器上,它僅僅是設(shè)置了一個(gè)別名。
免密登錄
ssh
?登錄分兩種,一種是基于口令(賬號(hào)密碼),另外一種是基于密鑰的方式。
基于口令,就是每次登錄輸入賬號(hào)和密碼,顯然這樣做是比較麻煩的,今天主要學(xué)習(xí)如何基于密鑰實(shí)現(xiàn)免密登錄。
基于密鑰驗(yàn)證原理
客戶機(jī)生成密鑰對(duì)(公鑰和私鑰),把公鑰上傳到服務(wù)器,每次登錄會(huì)與服務(wù)器的公鑰進(jìn)行比較,這種驗(yàn)證登錄的方法更加安全,也被稱為“公鑰驗(yàn)證登錄”。
具體實(shí)現(xiàn)步驟
1、在客戶機(jī)中生成密鑰對(duì)(公鑰和私鑰)?ssh-keygen
(默認(rèn)使用 RSA 非對(duì)稱加密算法)
運(yùn)行完?ssh-keygen
?會(huì)在?~/.ssh/
?目錄下,生成兩個(gè)文件:
id_rsa.pub
?:公鑰id_rsa
?:私鑰
2、把客戶機(jī)的公鑰傳送到服務(wù)
執(zhí)行?ssh-copy-id root@172.x.x.x
(ssh-copy-id
?它會(huì)把客戶機(jī)的公鑰追加到服務(wù)器?~/.ssh/authorized_keys
?的文件中)。
執(zhí)行完成后,運(yùn)行?ssh root@172.x.x.x
?就可以實(shí)現(xiàn)免密登錄服務(wù)器了。
配合上面設(shè)置好的別名,直接執(zhí)行?ssh lion
?就可以登錄,是不是非常方便。
wget
可以使我們直接從終端控制臺(tái)下載文件,只需要給出文件的HTTP或FTP地址。
wget [參數(shù)][URL地址]wget http://www.minjieren.com/wordpress-3.1-zh_CN.zip
wget
?非常穩(wěn)定,如果是由于網(wǎng)絡(luò)原因下載失敗,?wget
?會(huì)不斷嘗試,直到整個(gè)文件下載完畢。
常用參數(shù)
-c
?繼續(xù)中斷的下載。
備份
scp
它是?Secure Copy
?的縮寫(xiě),表示安全拷貝。scp
?可以使我們通過(guò)網(wǎng)絡(luò),把文件從一臺(tái)電腦拷貝到另一臺(tái)電腦。
scp
?是基于?ssh
?的原理來(lái)運(yùn)作的,?ssh
?會(huì)在兩臺(tái)通過(guò)網(wǎng)絡(luò)連接的電腦之間創(chuàng)建一條安全通信的管道,?scp
?就利用這條管道安全地拷貝文件。
scp source_file destination_file # source_file 表示源文件,destination_file 表示目標(biāo)文
其中?source_file
?和?destination_file
?都可以這樣表示:user@ip:file_name
?,?user
?是登錄名,?ip
?是域名或?ip
?地址。file_name
?是文件路徑。
scp file.txt root@192.168.1.5:/root # 表示把我的電腦中當(dāng)前文件夾下的 file.txt 文件拷貝到遠(yuǎn)程電腦scp root@192.168.1.5:/root/file.txt file.txt # 表示把遠(yuǎn)程電腦上的 file.txt 文件拷貝到本機(jī)
rsync
rsync
?命令主要用于遠(yuǎn)程同步文件。它可以同步兩個(gè)目錄,不管它們是否處于同一臺(tái)電腦。它應(yīng)該是最常用于“增量備份”的命令了。它就是智能版的?scp
?命令。
軟件安裝
yum install rsync
基礎(chǔ)用法
rsync -arv Images/ backups/ # 將Images 目錄下的所有文件備份到 backups 目錄下rsync -arv Images/ root@192.x.x.x:backups/ # 同步到服務(wù)器的backups目錄下
常用參數(shù)
-a
?保留文件的所有信息,包括權(quán)限,修改日期等;-r
?遞歸調(diào)用,表示子目錄的所有文件也都包括;-v
?冗余模式,輸出詳細(xì)操作信息。
默認(rèn)地,?rsync
?在同步時(shí)并不會(huì)刪除目標(biāo)目錄的文件,例如你在源目錄中刪除一個(gè)文件,但是用?rsync
?同步時(shí),它并不會(huì)刪除同步目錄中的相同文件。如果向刪除也可以這么做:rsync -arv --delete Images/ backups/
?。
系統(tǒng)
halt
關(guān)閉系統(tǒng),需要?root
?身份。
halt
reboot
重啟系統(tǒng),需要?root
?身份。
reboot
poweroff
直接運(yùn)行即可關(guān)機(jī),不需要?root
?身份。
Vim 編輯器
Vim 是什么?
Vim
?是從?vi
?發(fā)展出來(lái)的一個(gè)文本編輯器。其代碼補(bǔ)完、編譯及錯(cuò)誤跳轉(zhuǎn)等方便編程的功能特別豐富,在程序員中被廣泛使用。和?Emacs
?并列成為類?Unix
?系統(tǒng)用戶最喜歡的編輯器。
Vim 常用模式
交互模式
插入模式
命令模式
可視模式
交互模式
也成為正常模式,這是?Vim
?的默認(rèn)模式,每次運(yùn)行?Vim
?程序的時(shí)候,就會(huì)進(jìn)入這個(gè)模式。
例如執(zhí)行?vim name.txt
?則會(huì)進(jìn)入交互模式。
交互模式特征:
在這個(gè)模式下,你不能輸入文本;
它可以讓我們?cè)谖谋鹃g移動(dòng),刪除一行文本,復(fù)制黏貼文本,跳轉(zhuǎn)到指定行,撤銷操作,等等。
插入模式
這個(gè)模式是我們熟悉的文本編輯器的模式,就是可以輸入任何你想輸入的內(nèi)容。進(jìn)入這個(gè)模式有幾種方法,最常用的方法是按字母鍵?i
?(?i、I、a、A、o、O
?都可以進(jìn)入插入模式,只是所處的位置不同),退出這種模式,只需要按下?Esc
?鍵。
i, I
?進(jìn)入輸入模式?Insert mode
?:i
?為“從目前光標(biāo)所在處輸入”,?I
?為“在目前所在行的第一個(gè)非空格符處開(kāi)始輸入”;a, A
?進(jìn)入輸入模式?Insert mode
?:a
?為“從目前光標(biāo)所在的下一個(gè)字符處開(kāi)始輸入”,A
?為“從光標(biāo)所在行的最后一個(gè)字符處開(kāi)始輸入”;o, O
?進(jìn)入輸入模式?Insert mode
?:o
?為“在目前光標(biāo)所在的下一行處輸入新的一行”;O
?為在目前光標(biāo)所在處的上一行輸入新的一行。
命令模式
命令模式也稱為底線命令模式,這個(gè)模式下可以運(yùn)行一些命令例如“退出”,“保存”,等動(dòng)作。
也可以用這個(gè)模式來(lái)激活一些?Vim
?配置,例如語(yǔ)法高亮,顯示行號(hào),等。甚至還可以發(fā)送一些命令給終端命令行,例如?ls、cp
?。
為了進(jìn)入命令模式,首先要進(jìn)入交互模式,再按下冒號(hào)鍵。
用一張圖表示三種模式如何切換:

基本操作
打開(kāi) Vim
在終端命令行中輸入?vim
?回車后?Vim
?就會(huì)被運(yùn)行起來(lái),也可以用?Vim
?來(lái)打開(kāi)一個(gè)文件,只需要在?vim
?后面再加文件名。如?vim file.name
?,如果文件不存在,那么會(huì)被創(chuàng)建。
插入
進(jìn)入文件之后,此時(shí)處于交互模式,可以通過(guò)輸入?i
?進(jìn)入插入模式。
移動(dòng)
在?Vim
?的交互模式下,我們可以在文本中移動(dòng)光標(biāo)。
h
?向左移動(dòng)一個(gè)字符j
?向下移動(dòng)一個(gè)字符k
?向上移動(dòng)一個(gè)字符i
?向右移動(dòng)一個(gè)字符
當(dāng)然也可以使用四個(gè)方向鍵進(jìn)行移動(dòng),效果是一樣的。
跳至行首和行末
行首:在交互模式下,為了將光標(biāo)定位到一行的開(kāi)始位置,只需要按下數(shù)字鍵?
0
?即可,鍵盤上的?Home
?鍵也有相同效果。行末:在交互模式下,為了將光標(biāo)定位到一行的末尾,只需要按下美元符號(hào)鍵?
$
?即可,鍵盤上的?End
?鍵也有相同效果。
按單詞移動(dòng)
在交互模式下,按字母鍵?w
?可以一個(gè)單詞一個(gè)單詞的移動(dòng)。
退出文件
在交互模式下,按下冒號(hào)鍵?:
?進(jìn)入命令模式,再按下?q
?鍵,就可以退出了。
如果在退出之前又修改了文件,就直接想用?:q
?退出?Vim
?,那么?Vim
?會(huì)顯示一個(gè)紅字標(biāo)明錯(cuò)誤信息。此時(shí)我們有兩個(gè)選擇:
保存并退出?
:wq
?或?:x
?;不保存且退出?
:q!
?。
標(biāo)準(zhǔn)操作
刪除字符
在交互模式下,將光標(biāo)定位到一個(gè)你想要?jiǎng)h除的字符上,按下字母鍵?x
?你會(huì)發(fā)現(xiàn)這個(gè)字符被刪除了。
也可以一次性刪除多個(gè)字符,只需要在按?x
?鍵之前輸入數(shù)字即可。
刪除(剪切)單詞,行
刪除一行:連按兩次?
d
?來(lái)刪除光標(biāo)所在的那一行。刪除多行:例如先輸入數(shù)字?
2
?,再按下?dd
?,就會(huì)刪除從光標(biāo)所在行開(kāi)始的兩行。刪除一個(gè)單詞:將光標(biāo)置于一個(gè)單詞的首字母處,然后按下?
dw
?。刪除多個(gè)單詞:例如先按數(shù)字鍵?
2
?再按?dw
?就可以刪除兩個(gè)單詞了。從光標(biāo)所在位置刪除至行首:
d0
?。從光標(biāo)所在位置刪除至行末:
d$
?。
復(fù)制單詞,行
復(fù)制行:按兩次?
y
?會(huì)把光標(biāo)所在行復(fù)制到內(nèi)存中,和?dd
?類似,?dd
?用于“剪切”光標(biāo)所在行。復(fù)制單詞:
yw
?會(huì)復(fù)制一個(gè)單詞。復(fù)制到行末:
y$
?是復(fù)制從光標(biāo)所在處到行末的所有字符。復(fù)制到行首:
y0
?是復(fù)制光標(biāo)所在處到行首的所有字符。
粘貼
如果之前用?dd
?或者?yy
?剪切復(fù)制過(guò)來(lái)的,可以使用?p
?來(lái)粘貼。同樣也可以使用?數(shù)字+p
來(lái)表示復(fù)制多次。
替換一個(gè)字符
在交互模式下,將光標(biāo)置于想要替換的字符上。按下?r
?鍵,接著輸入你要替換的字符即可。
撤銷操作
如果要撤銷最近的修改,只需要按下?u
?鍵,如果想要撤銷最近四次修改,可以按下4,再按下?u
?。
重做
取消撤銷,也就是重做之前的修改使用?ctrl + r
?。
跳轉(zhuǎn)到指定行
Vim
?編輯的文件中,每一行都有一個(gè)行號(hào),行號(hào)從1開(kāi)始,逐一遞增。
行號(hào)默認(rèn)是不顯示,如果需要它顯示的話,可以進(jìn)入命令模式,然后輸入?set nu
?,如果要隱藏行號(hào)的話,使用?set nonu
?。
跳轉(zhuǎn)到指定行:
數(shù)字+gg
?,例如?7gg
?,表示跳轉(zhuǎn)到第7行。要跳轉(zhuǎn)到最后一行,按下?
G
?。要跳轉(zhuǎn)到第一行,按下?
gg
?。
高級(jí)操作
查找
處于交互模式下,按下?/
?鍵,那么就進(jìn)入查找模式,輸入你要查找的字符串,然后按下回車。光標(biāo)就會(huì)跳轉(zhuǎn)到文件中下一個(gè)查找到的匹配處。如果字符串不存在,那么會(huì)顯示?"pattern not found"
?。
n
?跳轉(zhuǎn)到下一個(gè)匹配項(xiàng);N
?跳轉(zhuǎn)到上一個(gè)匹配項(xiàng)。
[注意] 用斜杠來(lái)進(jìn)行的查找是從當(dāng)前光標(biāo)處開(kāi)始向文件尾搜索,如果你要從當(dāng)前光標(biāo)處開(kāi)始,向文件頭搜索則使用??
?,當(dāng)然也可以先按下?gg
?跳轉(zhuǎn)到第一行在進(jìn)行全文搜索。
查找并替換
替換光標(biāo)所在行第一個(gè)匹配的字符串:
# 語(yǔ)法:s/舊字符串/新字符串# 實(shí)例:s/one/two
替換光標(biāo)所在行所有舊字符串為新字符串:
# 語(yǔ)法:s/舊字符串/新字符串/g
替換第幾行到第幾行中所有字符串:
# 語(yǔ)法:n,m s/舊字符串/新字符串/g# 實(shí)例:2,4 s/one/two/g
最常用的就是全文替換了:
# 語(yǔ)法:%s/舊字符串/新字符串/g
合并文件
可以用冒號(hào)?+r
?(?:r
?) 實(shí)現(xiàn)在光標(biāo)處插入一個(gè)文件的內(nèi)容。
:r filename # 可以用Tab鍵來(lái)自動(dòng)補(bǔ)全另外一個(gè)文件的路徑
分屏
Vim
?有一個(gè)特別便捷的功能那就是分屏,可以同時(shí)打開(kāi)好幾個(gè)文件,分屏之后,屏幕每一塊被稱為一個(gè)?viewport
?,表示“視口”。
橫向分屏?
:sp 文件名
垂直分屏?
:vsp 文件名
分屏模式下的快捷鍵
Ctrl + w
?再加?Ctrl + w
?,表示從一個(gè)?viewport
?移動(dòng)光標(biāo)到另外一個(gè)?viewport
?;Ctrl + w
?再加 “方向鍵”,就可以移動(dòng)到這個(gè)方向所處的下一個(gè)視口了;Ctrl + w
?再加?+
?號(hào),表示擴(kuò)大當(dāng)前視口;Ctrl + w
?再加?-
?號(hào),表示縮小當(dāng)前視口;Ctrl + w
?再加?=
?號(hào),表示平均當(dāng)前視口;Ctrl + w
?再加?r
?鍵,會(huì)反向調(diào)換視口位置;Ctrl + w
?再加?q
?鍵,會(huì)關(guān)閉當(dāng)前視口;Ctrl + w
?再加?o
?鍵,會(huì)關(guān)閉除當(dāng)前視口以外的所有視口;
運(yùn)行外部命令?:!
在?Vim
?中可以運(yùn)行一些終端命令,只要先輸入?:!
?,然后接命令名稱。
例如:
:!ls # 在Vim中打開(kāi)的文件所在的目錄運(yùn)行l(wèi)s命令
可視模式
前面只講了?Vim
?的三種模式,其實(shí)還有一種模式叫做可視模式。
進(jìn)入它的三種方式(都是從交互模式開(kāi)始):
v
?字符可視模式,進(jìn)入后配合方向鍵選中字符后,然后再按?d
?鍵可以刪除選中。V
?行可視模式,進(jìn)入后光標(biāo)所在行默認(rèn)被選中,然后再按?d
?鍵可以刪除所在行。Ctrl + v
?塊可視模式,它是可視模式最有用的功能了,配合?d
?和?I
?鍵可以實(shí)現(xiàn)刪除選中的內(nèi)容和插入內(nèi)容。
同時(shí)選中多行,并在選中行頭部插入內(nèi)容的具體操作步驟:
1. ctrl + v 進(jìn)入塊可視模式
2. 使用方向鍵進(jìn)行選中(上下左右)假設(shè)選中5行
3. 輸入 I 鍵進(jìn)行多行同時(shí)插入操作
4. 插入完成后連續(xù)按兩下 esc 鍵,實(shí)現(xiàn)多行同時(shí)插入相同字符
進(jìn)入可視模式之后的操作鍵:
d
?鍵,表示刪除選中;I
?鍵,表示在選中之前插入;u
?鍵,表示選中變?yōu)樾?xiě);U
?鍵,表示選中變?yōu)榇髮?xiě);
Vim 配置
選項(xiàng)參數(shù)
在?Vim
?被啟動(dòng)后,可以運(yùn)行一些指令來(lái)激活一些選項(xiàng)參數(shù),但是這些選項(xiàng)參數(shù)的配置在退出Vim
?時(shí)會(huì)被忘記,例如前面講解的激活行號(hào)。如果希望所在的配置是永久性的,那么需要在家目錄(?cd ~
?)創(chuàng)建一個(gè)?Vim
?的配置文件?.vimrc
?。
.vimrc
set number " 顯示行號(hào)
syntax on " 激活語(yǔ)法高亮
set showcmd " 實(shí)時(shí)看到輸入的命令
set ignorecase " 搜索時(shí)不區(qū)分大小寫(xiě)
set mouse=a " 激活鼠標(biāo),用鼠標(biāo)選中時(shí)相當(dāng)于進(jìn)入可視模式
Vim
?配置非常豐富,我們可以通過(guò)個(gè)性化配置把?Vim
?打造成屬于自己的?IDE
?等等。在?github
?上也可以搜索到一些強(qiáng)大的?Vim
?配置文件。