天天看點

2萬字系統總結,帶你實作Linux指令自由

前言

Linux 的學習對于一個程式員的重要性是不言而喻的。前端開發相比後端開發,接觸 ​

​Linux​

​機會相對較少,是以往往容易忽視它。但是學好它卻是程式員必備修養之一。

如果本文對你有所幫助,請點個👍 吧。

作者使用的是阿裡雲伺服器 ​

​ECS​

​​ (最便宜的那種) ​

​CentOS 7.7​

​​ 64位。當然你也可以在自己的電腦安裝虛拟機,虛拟機中再去安裝 ​

​CentOS​

​ 系統(這就完全免費了)。至于它的安裝教程可以去谷歌搜尋下,相關教程非常多。

Linux 基礎

作業系統

作業系統 ​

​Operating System​

​​ 簡稱 ​

​OS​

​ ,是軟體的一部分,它是硬體基礎上的第一層軟體,是硬體和其它軟體溝通的橋梁。

作業系統會控制其他程式運作,管理系統資源,提供最基本的計算功能,如管理及配置記憶體、決定系統資源供需的優先次序等,同時還提供一些基本的服務程式。

2萬字系統總結,帶你實作Linux指令自由

什麼是 Linux

Linux 系統核心與 Linux 發行套件的差別

  • ​Linux​

    ​​ 系統核心指的是由 ​

    ​Linus Torvalds​

    ​ 負責維護,提供硬體抽象層、硬碟及檔案系統控制及多任務功能的系統核心程式。
  • ​Linux​

    ​​ 發行套件系統是我們常說的 ​

    ​Linux​

    ​ 作業系統,也即是由 ​

    ​Linux​

    ​ 核心與各種常用軟體的集合産品。

總結:真正的 ​

​Linux​

​ 指的是系統核心,而我們常說的 ​

​Linux​

​ 指的是“發行版完整的包含一些基礎軟體的作業系統”。

Linux 對比 Windows

  1. 穩定且有效率;
  2. 免費(或少許費用);
  3. 漏洞少且快速修補;
  4. 多任務多使用者;
  5. 更加安全的使用者與檔案權限政策;
  6. 适合小核心程式的嵌入系統;
  7. 相對不耗資源。

Linux 系統種類

  • 紅帽企業版​

    ​Linux​

    ​ :​

    ​RHEL​

    ​ 是全世界内使用最廣泛的 ​

    ​Linux​

    ​ 系統。它具有極強的性能與穩定性,是衆多生成環境中使用的(收費的)系統。
  • ​Fedora​

    ​​ :由紅帽公司釋出的桌面版系統套件,使用者可以免費體驗到最新的技術或工具,這些技術或工具在成熟後會被加入到 ​

    ​RHEL​

    ​ 系統中,是以 ​

    ​Fedora​

    ​ 也成為 ​

    ​RHEL​

    ​ 系統的試驗版本。
  • ​CentOS​

    ​​ :通過把 ​

    ​RHEL​

    ​ 系統重新編譯并釋出給使用者免費使用的 ​

    ​Linux​

    ​ 系統,具有廣泛的使用人群。
  • ​Deepin​

    ​ :中國發行,對優秀的開源成品進行內建和配置。
  • ​Debian​

    ​ :穩定性、安全性強,提供了免費的基礎支援,在國外擁有很高的認可度和使用率。
  • ​Ubuntu​

    ​​ :是一款派生自 ​

    ​Debian​

    ​ 的作業系統,對新款硬體具有極強的相容能力。​

    ​Ubuntu​

    ​ 與 ​

    ​Fedora​

    ​ 都是極其出色的 ​

    ​Linux​

    ​ 桌面系統,而且 ​

    ​Ubuntu​

    ​ 也可用于伺服器領域。

終端連接配接阿裡雲伺服器

2萬字系統總結,帶你實作Linux指令自由

通過執行 ​

​ssh [email protected]

​ 指令,然後輸入伺服器連接配接密碼就可以順利登陸遠端伺服器。從現在開始我們就可以在本地電腦操作遠端伺服器。

  1. 這個黑色的面闆就是終端也就是​

    ​Shell​

    ​ (指令行環境)。
  2. ​ssh root@xxx​

    ​​ 這是一條指令,必須要在 ​

    ​Shell​

    ​ 中才能執行。

Shell

​Shell​

​​ 這個單詞的原意是“外殼”,跟 ​

​kernel​

​(核心)相對應,比喻核心外面的一層,即使用者跟核心互動的對話界面。

  • ​Shell​

    ​​ 是一個程式,提供一個與使用者對話的環境。這個環境隻有一個指令提示符,讓使用者從鍵盤輸入指令,是以又稱為指令行環境( ​

    ​command line interface​

    ​ ,簡寫為 ​

    ​CLI​

    ​ )。​

    ​Shell​

    ​ 接收到使用者輸入的指令,将指令送入作業系統執行,并将結果傳回給使用者。
  • ​Shell​

    ​​ 是一個指令解釋器,解釋使用者輸入的指令。它支援變量、條件判斷、循環操作等文法,是以使用者可以用 ​

    ​Shell​

    ​ 指令寫出各種小程式,又稱為 ​

    ​Shell​

    ​ 腳本。這些腳本都通過​

    ​Shell​

    ​ 的解釋執行,而不通過編譯。
  • ​Shell​

    ​ 是一個工具箱,提供了各種小工具,供使用者友善地使用作業系統的功能。

Shell 的種類

​Shell​

​​ 有很多種,隻要能給使用者提供指令行環境的程式,都可以看作是 ​

​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​

​​ 中的預設 ​

​Shell​

​​ 就是 ​

​Bash​

​ 。

通過執行 ​

​echo $SHELL​

​​ 指令可以檢視到目前正在使用的 ​

​Shell​

​​ 。還可以通過 ​

​cat /etc/shells​

​​ 檢視目前系統安裝的所有 ​

​Shell​

​ 種類。

指令

指令行提示符

進入指令行環境以後,使用者會看到 ​

​Shell​

​​ 的提示符。提示符往往是一串字首,最後以一個美元符号 ​

​$​

​ 結尾,使用者可以在這個符号後面輸入各種指令。

執行一個簡單的指令 ​

​pwd​

​ :

[root@iZm5e8dsxce9ufaic7hi3uZ ~]# pwd
/root
複制代碼      

指令解析:

  • ​root​

    ​:表示使用者名;
  • ​iZm5e8dsxce9ufaic7hi3uZ​

    ​:表示主機名;
  • ​~​

    ​​:表示目前所在目錄為家目錄,其中 ​

    ​root​

    ​ 使用者的家目錄是 ​

    ​/root​

    ​ 普通使用者的家目錄在 ​

    ​/home​

    ​ 下;
  • ​#​

    ​​:訓示你所具有的權限( ​

    ​root​

    ​ 使用者為 ​

    ​#​

    ​ ,普通使用者為 ​

    ​$​

    ​ )。
  • 執行​

    ​whoami​

    ​ 指令可以檢視目前使用者名;
  • 執行​

    ​hostname​

    ​ 指令可以檢視目前主機名;

關于如何建立、切換、删除使用者,在後面的使用者與權限會具體講解,這裡先使用 ​

​root​

​ 使用者進行示範。

[備注] ​

​root​

​ 是超級使用者,具備作業系統的一切權限。

指令格式

command parameters(指令 參數)
複制代碼      
長短參數
單個參數:ls -a(a 是英文 all 的縮寫,表示“全部”)
多個參數:ls -al(全部檔案 + 清單形式展示)
單個長參數:ls --all
多個長參數:ls --reverse --all
長短混合參數:ls --all -l
複制代碼      
參數值
短參數:command -p 10(例如:ssh [email protected] -p 22)
長參數:command --paramters=10(例如:ssh [email protected] --port=22)
複制代碼      

快捷方式

在開始學習 ​

​Linux​

​​ 指令之前,有這麼一些快捷方式,是必須要提前掌握的,它将貫穿整個 ​

​Linux​

​ 使用生涯。

  • 通過上下方向鍵 ↑ ↓ 來調取過往執行過的​

    ​Linux​

    ​ 指令;
  • 指令或參數僅需輸入前幾位就可以用​

    ​Tab​

    ​ 鍵補全;
  • ​Ctrl + R​

    ​​ :用于查找使用過的指令(​

    ​history​

    ​ 指令用于列出之前使用過的所有指令,然後輸入 ​

    ​!​

    ​ 指令加上編号( ​

    ​!2​

    ​ )就可以直接執行該曆史指令);
  • ​Ctrl + L​

    ​:清除螢幕并将目前行移到頁面頂部;
  • ​Ctrl + C​

    ​:中止目前正在執行的指令;
  • ​Ctrl + U​

    ​:從光标位置剪切到行首;
  • ​Ctrl + K​

    ​:從光标位置剪切到行尾;
  • ​Ctrl + W​

    ​:剪切光标左側的一個單詞;
  • ​Ctrl + Y​

    ​​:粘貼 ​

    ​Ctrl + U | K | Y​

    ​ 剪切的指令;
  • ​Ctrl + A​

    ​:光标跳到指令行的開頭;
  • ​Ctrl + E​

    ​:光标跳到指令行的結尾;
  • ​Ctrl + D​

    ​​:關閉 ​

    ​Shell​

    ​ 會話;

檔案和目錄

檔案的組織

2萬字系統總結,帶你實作Linux指令自由

檢視路徑

pwd

顯示目前目錄的路徑

2萬字系統總結,帶你實作Linux指令自由
which

檢視指令的可執行檔案所在路徑, ​

​Linux​

​​ 下,每一條指令其實都對應一個可執行程式,在終端中輸入指令,按回車的時候,就是執行了對應的那個程式, ​

​which​

​​ 指令本身對應的程式也存在于 ​

​Linux​

​ 中。

總的來說一個指令就是一個可執行程式。

2萬字系統總結,帶你實作Linux指令自由

浏覽和切換目錄

ls

列出檔案和目錄,它是 ​

​Linux​

​ 最常用的指令之一。

【常用參數】

  • ​-a​

    ​ 顯示所有檔案和目錄包括隐藏的
  • ​-l​

    ​ 顯示詳細清單
  • ​-h​

    ​ 适合人類閱讀的
  • ​-t​

    ​ 按檔案最近一次修改時間排序
  • ​-i​

    ​​ 顯示檔案的 ​

    ​inode​

    ​ ( ​

    ​inode​

    ​ 是檔案内容的辨別)
2萬字系統總結,帶你實作Linux指令自由
cd

​cd​

​​ 是英語 ​

​change directory​

​ 的縮寫,表示切換目錄。

cd / --> 跳轉到根目錄
cd ~ --> 跳轉到家目錄
cd .. --> 跳轉到上級目錄
cd ./home --> 跳轉到目前目錄的home目錄下
cd /home/lion --> 跳轉到根目錄下的home目錄下的lion目錄
cd --> 不添加任何參數,也是回到家目錄
複制代碼      

[注意] 輸入​

​cd /ho​

​​ + 單次 ​

​tab​

​​ 鍵會自動補全路徑 + 兩次 ​

​tab​

​ 鍵會列出所有可能的目錄清單。

du

列舉目錄大小資訊。

【常用參數】

  • ​-h​

    ​ 适合人類閱讀的;
  • ​-a​

    ​ 同時列舉出目錄下檔案的大小資訊;
  • ​-s​

    ​ 隻顯示總計大小,不顯示具體資訊。

浏覽和建立檔案

cat

一次性顯示檔案所有内容,更适合檢視小的檔案。

cat cloud-init.log
複制代碼      

【常用參數】

  • ​-n​

    ​ 顯示行号。
less

分頁顯示檔案内容,更适合檢視大的檔案。

less cloud-init.log
複制代碼      

【快捷操作】

  • 空格鍵:前進一頁(一個螢幕);
  • ​b​

    ​ 鍵:後退一頁;
  • Enter鍵:前進一行;
  • ​y​

    ​ 鍵:後退一行;
  • 上下鍵:回退或前進一行;
  • ​d​

    ​ 鍵:前進半頁;
  • ​u​

    ​ 鍵:後退半頁;
  • ​q​

    ​​ 鍵:停止讀取檔案,中止 ​

    ​less​

    ​ 指令;
  • ​=​

    ​ 鍵:顯示目前頁面的内容是檔案中的第幾行到第幾行以及一些其它關于本頁内容的詳細資訊;
  • ​h​

    ​ 鍵:顯示幫助文檔;
  • ​/​

    ​​ 鍵:進入搜尋模式後,按 ​

    ​n​

    ​ 鍵跳到一個符合項目,按 ​

    ​N​

    ​ 鍵跳到上一個符合項目,同時也可以輸入正規表達式比對。
head

顯示檔案的開頭幾行(預設是10行)

head cloud-init.log
複制代碼      

【參數】

  • ​-n​

    ​​ 指定行數 ​

    ​head cloud-init.log -n 2​

tail

顯示檔案的結尾幾行(預設是10行)

tail cloud-init.log複制代碼      

【參數】

  • ​-n​

    ​​ 指定行數 ​

    ​tail cloud-init.log -n 2​

  • ​-f​

    ​​ 會每過1秒檢查下檔案是否有更新内容,也可以用 ​

    ​-s​

    ​ 參數指定間隔時間 ​

    ​tail -f -s 4 xxx.log​

touch

建立一個檔案

touch new_file複制代碼      
mkdir

建立一個目錄

mkdir new_folder複制代碼      

【常用參數】

  • ​-p​

    ​​ 遞歸的建立目錄結構 ​

    ​mkdir -p one/two/three​

檔案的複制和移動

cp

拷貝檔案和目錄

cp file file_copy --> file 是目标檔案,file_copy 是拷貝出來的檔案cp file one --> 把 file 檔案拷貝到 one 目錄下,并且檔案名依然為 filecp file one/file_copy --> 把 file 檔案拷貝到 one 目錄下,檔案名為file_copycp *.txt folder --> 把目前目錄下所有 txt 檔案拷貝到 folder 目錄下複制代碼      

【常用參數】

  • ​-r​

    ​ 遞歸的拷貝,常用來拷貝一整個目錄
mv

移動(重命名)檔案或目錄,與cp指令用法相似。

mv file one --> 将 file 檔案移動到 one 目錄下mv new_folder one --> 将 new_folder 檔案夾移動到one目錄下mv *.txt folder --> 把目前目錄下所有 txt 檔案移動到 folder 目錄下mv file new_file --> file 檔案重命名為 new_file複制代碼      

檔案的删除和連結

rm

删除檔案和目錄,由于 ​

​Linux​

​ 下沒有資源回收筒,一旦删除非常難恢複,是以需要謹慎操作

rm new_file  --> 删除 new_file 檔案rm f1 f2 f3  --> 同時删除 f1 f2 f3 3個檔案複制代碼      

【常用參數】

  • ​-i​

    ​ 向使用者确認是否删除;
  • ​-f​

    ​ 檔案強制删除;
  • ​-r​

    ​​ 遞歸删除檔案夾,著名的删除操作 ​

    ​rm -rf​

    ​ 。
ln

英文 ​

​Link​

​ 的縮寫,表示建立連結。

學習建立連結之前,首先要了解連結是什麼,我們先來看看 ​

​Linux​

​ 的檔案是如何存儲的:

​Linux​

​​ 檔案的存儲方式分為3個部分,檔案名、檔案内容以及權限,其中檔案名的清單是存儲在硬碟的其它地方和檔案内容是分開存放的,每個檔案名通過 ​

​inode​

​ 辨別綁定到檔案内容。

Linux 下有兩種連結類型:硬連結和軟連結。

硬連結

使連結的兩個檔案共享同樣檔案内容,就是同樣的 ​

​inode​

​ ,一旦檔案1和檔案2之間有了硬連結,那麼修改任何一個檔案,修改的都是同一塊内容,它的缺點是,隻能建立指向檔案的硬連結,不能建立指向目錄的(其實也可以,但比較複雜)而軟連結都可以,是以軟連結使用更加廣泛。

ln file1 file2  --> 建立 file2 為 file1 的硬連結複制代碼      
2萬字系統總結,帶你實作Linux指令自由

如果我們用 ​

​rm file1​

​​ 來删除 ​

​file1​

​​ ,對 ​

​file2​

​​ 沒有什麼影響,對于硬連結來說,删除任意一方的檔案,共同指向的檔案内容并不會從硬碟上删除。隻有同時删除了 ​

​file1​

​​ 與​

​file2​

​ 後,它們共同指向的檔案内容才會消失。

軟連結

軟連結就類似 ​

​windows​

​ 下快捷方式。

ln -s file1 file2複制代碼      
2萬字系統總結,帶你實作Linux指令自由

執行 ​

​ls -l​

​ 命名檢視目前目錄下檔案的具體資訊

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複制代碼      

其實 ​

​file2​

​​ 隻是 ​

​file1​

​​ 的一個快捷方式,它指向的是 ​

​file1​

​​ ,是以顯示的是 ​

​file1​

​​ 的内容,但其實 ​

​file2​

​​ 的 ​

​inode​

​​ 與 ​

​file1​

​​ 并不相同。如果我們删除了 ​

​file2​

​​ 的話, ​

​file1​

​​是不會受影響的,但如果删除 ​

​file1​

​​ 的話, ​

​file2​

​ 就會變成死連結,因為指向的檔案不見了。

使用者與權限

使用者

​Linux​

​​ 是一個多使用者的作業系統。在 ​

​Linux​

​​ 中,理論上來說,我們可以建立無數個使用者,但是這些使用者是被劃分到不同的群組裡面的,有一個使用者,名叫 ​

​root​

​ ,是一個很特殊的使用者,它是超級使用者,擁有最高權限。

2萬字系統總結,帶你實作Linux指令自由

自己建立的使用者是有限權限的使用者,這樣大大提高了 ​

​Linux​

​​ 系統的安全性,有效防止誤操作或是病毒攻擊,但是我們執行的某些指令需要更高權限時可以使用 ​

​sudo​

​ 指令。

sudo

以 ​

​root​

​ 身份運作指令

sudo date  --> 當然檢視日期是不需要sudo的這裡隻是示範,sudo 完之後一般還需要輸入使用者密碼的複制代碼      
useradd + passwd
  • ​useradd​

    ​ 添加新使用者
  • ​passwd​

    ​ 修改使用者密碼

這兩個指令需要 ​

​root​

​ 使用者權限

useradd lion --> 添加一個lion使用者,添加完之後在 /home 路徑下可以檢視passwd lion --> 修改lion使用者的密碼複制代碼      
userdel

删除使用者,需要 ​

​root​

​ 使用者權限

userdel lion --> 隻會删除使用者名,不會從/home中删除對應檔案夾userdel lion -r --> 會同時删除/home下的對應檔案夾複制代碼      
su

切換使用者,需要 ​

​root​

​ 使用者權限

sudo su --> 切換為root使用者(exit 指令或 CTRL + D 快捷鍵都可以使普通使用者切換為 root 使用者)su lion --> 切換為普通使用者su - --> 切換為root使用者複制代碼      

群組的管理

​Linux​

​ 中每個使用者都屬于一個特定的群組,如果你不設定使用者的群組,預設會建立一個和它的使用者名一樣的群組,并且把使用者劃歸到這個群組。

groupadd

建立群組,用法和 ​

​useradd​

​ 類似。

groupadd friends複制代碼      
groupdel

删除一個已存在的群組

groupdel foo  --> 删除foo群組複制代碼      
groups

檢視使用者所在群組

groups lion  --> 檢視 lion 使用者所在的群組複制代碼      
usermod

用于修改使用者的賬戶。

【常用參數】

  • ​-l​

    ​​ 對使用者重命名。需要注意的是 ​

    ​/home​

    ​ 中的使用者家目錄的名字不會改變,需要手動修改。
  • ​-g​

    ​​ 修改使用者所在的群組,例如 ​

    ​usermod -g friends lion​

    ​修改 ​

    ​lion​

    ​ 使用者的群組為 ​

    ​friends​

    ​ 。
  • ​-G​

    ​​ 一次性讓使用者添加多個群組,例如 ​

    ​usermod -G friends,foo,bar lion​

    ​ 。
  • ​-a​

    ​​ ​

    ​-G​

    ​ 會讓你離開原先的群組,如果你不想這樣做的話,就得再添加 ​

    ​-a​

    ​ 參數,意味着​

    ​append​

    ​ 追加的意思。
chgrp

用于修改檔案的群組。

chgrp bar file.txt --> file.txt檔案的群組修改為bar複制代碼      
chown

改變檔案的所有者,需要 ​

​root​

​ 身份才能運作。

chown lion file.txt --> 把其它使用者建立的file.txt轉讓給lion使用者chown lion:bar file.txt --> 把file.txt的使用者改為lion,群組改為bar複制代碼      

【常用參數】

  • ​-R​

    ​​ 遞歸設定子目錄和子檔案, ​

    ​chown -R lion:lion /home/frank​

    ​ 把 ​

    ​frank​

    ​ 檔案夾的使用者和群組都改為 ​

    ​lion​

    ​ 。

檔案權限管理

chmod

修改通路權限。

chmod 740 file.txt複制代碼      

【常用參數】

  • ​-R​

    ​​ 可以遞歸地修改檔案通路權限,例如 ​

    ​chmod -R 777 /home/lion​

修改權限的确簡單,但是了解其深層次的意義才是更加重要的。下面我們來系統的學習​

​Linux​

​ 的檔案權限。

[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​

​ 表示檔案或目錄的權限。讓我們一起來解讀它具體代表什麼?

  • ​d​

    ​​ :表示目錄,就是說這是一個目錄,普通檔案是 ​

    ​-​

    ​ ,連結是 ​

    ​l​

    ​ 。
  • ​r​

    ​​ :​

    ​read​

    ​ 表示檔案可讀。
  • ​w​

    ​​ :​

    ​write​

    ​ 表示檔案可寫,一般有寫的權限,就有删除的權限。
  • ​x​

    ​​ :​

    ​execute​

    ​ 表示檔案可執行。
  • ​-​

    ​ :表示沒有相應權限。

權限的整體是按使用者來劃分的,如下圖所示:

2萬字系統總結,帶你實作Linux指令自由

現在再來了解這句權限 ​

​drwxr-xr-x​

​ 的意思:

  • 它是一個檔案夾;
  • 它的所有者具有:讀、寫、執行權限;
  • 它的群組使用者具有:讀、執行的權限,沒有寫的權限;
  • 它的其它使用者具有:讀、執行的權限,沒有寫的權限。

現在了解了權限,我們使用 ​

​chmod​

​​ 來嘗試修改權限。​

​chmod​

​​ 它不需要是 ​

​root​

​​ 使用者才能運作的,隻要你是此檔案所有者,就可以用 ​

​chmod​

​ 來修改檔案的通路權限。

數字配置設定權限

權限 數字
r 4
w 2
x 1

是以要改變權限,隻要做一些簡單的加法就行:

chmod 640 hello.c # 分析6 = 4 + 2 + 0 表示所有者具有 rw 權限4 = 4 + 0 + 0 表示群組使用者具有 r 權限0 = 0 + 0 + 0 表示其它使用者沒有權限對應文字權限為:-rw-r-----複制代碼      

用字母來配置設定權限

  • ​u​

    ​​ :​

    ​user​

    ​ 的縮寫,使用者的意思,表示所有者。
  • ​g​

    ​​ :​

    ​group​

    ​ 的縮寫,群組的意思,表示群組使用者。
  • ​o​

    ​​ :​

    ​other​

    ​ 的縮寫,其它的意思,表示其它使用者。
  • ​a​

    ​​ :​

    ​all​

    ​ 的縮寫,所有的意思,表示所有使用者。
  • ​+​

    ​ :加号,表示添權重限。
  • ​-​

    ​ :減号,表示去除權限。
  • ​=​

    ​ :等于号,表示配置設定權限。
chmod u+rx file --> 檔案file的所有者增加讀和運作的權限chmod g+r file --> 檔案file的群組使用者增加讀的權限chmod o-r file --> 檔案file的其它使用者移除讀的權限chmod g+r o-r file --> 檔案file的群組使用者增加讀的權限,其它使用者移除讀的權限chmod go-r file --> 檔案file的群組和其他使用者移除讀的權限chmod +x file --> 檔案file的所有使用者增加運作的權限chmod u=rwx,g=r,o=- file --> 檔案file的所有者配置設定讀寫和執行的權限,群組其它使用者配置設定讀的權限,其他使用者沒有任何權限複制代碼      

查找檔案

locate

搜尋包含關鍵字的所有檔案和目錄。後接需要查找的檔案名,也可以用正規表達式。

安裝 locate
yum -y install mlocate --> 安裝包updatedb --> 更新資料庫複制代碼locate file.txtlocate fil*.txt複制代碼      

[注意] ​

​locate​

​​ 指令會去檔案資料庫中查找指令,而不是全磁盤查找,是以剛建立的檔案并不會更新到資料庫中,是以無法被查找到,可以執行 ​

​updatedb​

​ 指令去更新資料庫。

find

用于查找檔案,它會去周遊你的實際硬碟進行查找,而且它允許我們對每個找到的檔案進行後續操作,功能非常強大。

find <何處> <何物> <做什麼>複制代碼      
  • 何處:指定在哪個目錄查找,此目錄的所有子目錄也會被查找。
  • 何物:查找什麼,可以根據檔案的名字來查找,也可以根據其大小來查找,還可以根據其最近通路時間來查找。
  • 做什麼:找到檔案後,可以進行後續處理,如果不指定這個參數,​

    ​find​

    ​ 指令隻會顯示找到的檔案。
根據檔案名查找
find -name "file.txt" --> 目前目錄以及子目錄下通過名稱查找檔案find . -name "syslog" --> 目前目錄以及子目錄下通過名稱查找檔案find / -name "syslog" --> 整個硬碟下查找syslogfind /var/log -name "syslog" --> 在指定的目錄/var/log下查找syslog檔案find /var/log -name "syslog*" --> 查找syslog1、syslog2 ... 等檔案,通配符表示所有find /var/log -name "*syslog*" --> 查找包含syslog的檔案 複制代碼      

[注意] ​

​find​

​​ 指令隻會查找完全符合 “何物” 字元串的檔案,而 ​

​locate​

​ 會查找所有包含關鍵字的檔案。

根據檔案大小查找
find /var -size +10M --> /var 目錄下查找檔案大小超過 10M 的檔案find /var -size -50k --> /var 目錄下查找檔案大小小于 50k 的檔案find /var -size +1G --> /var 目錄下查找檔案大小查過 1G 的檔案find /var -size 1M --> /var 目錄下查找檔案大小等于 1M 的檔案複制代碼      
根據檔案最近通路時間查找
find -name "*.txt" -atime -7  --> 近 7天内通路過的.txt結尾的檔案複制代碼      
僅查找目錄或檔案
find . -name "file" -type f  --> 隻查找目前目錄下的file檔案find . -name "file" -type d  --> 隻查找目前目錄下的file目錄複制代碼      
操作查找結果
find -name "*.txt" -printf "%p - %u\n" --> 找出所有字尾為txt的檔案,并按照 %p - %u\n 格式列印,其中%p=檔案名,%u=檔案所有者find -name "*.jpg" -delete --> 删除目前目錄以及子目錄下所有.jpg為字尾的檔案,不會有删除提示,是以要慎用find -name "*.c" -exec chmod 600 {} \; --> 對每個.c結尾的檔案,都進行 -exec 參數指定的操作,{} 會被查找到的檔案替代,\; 是必須的結尾find -name "*.c" -ok chmod 600 {} \; --> 和上面的功能一直,會多一個确認提示複制代碼      

軟體倉庫

​Linux​

​​ 下軟體是以包的形式存在,一個軟體包其實就是軟體的所有檔案的壓縮包,是二進制的形式,包含了安裝軟體的所有指令。​

​Red Hat​

​​ 家族的軟體包字尾名一般為 ​

​.rpm​

​​ ,​

​Debian​

​​ 家族的軟體包字尾是 ​

​.deb​

​ 。

​Linux​

​​ 的包都存在一個倉庫,叫做軟體倉庫,它可以使用 ​

​yum​

​​ 來管理軟體包, ​

​yum​

​​ 是 ​

​CentOS​

​​ 中預設的包管理工具,适用于 ​

​Red Hat​

​​ 一族。可以了解成 ​

​Node.js​

​​ 的 ​

​npm​

​ 。

yum 常用指令

  • ​yum update | yum upgrade​

    ​ 更新軟體包
  • ​yum search xxx​

    ​ 搜尋相應的軟體包
  • ​yum install xxx​

    ​ 安裝軟體包
  • ​yum remove xxx​

    ​ 删除軟體包

切換 CentOS 軟體源

有時候 ​

​CentOS​

​​ 預設的 ​

​yum​

​​ 源不一定是國内鏡像,導緻 ​

​yum​

​​ 線上安裝及更新速度不是很理想。這時候需要将 ​

​yum​

​ 源設定為國内鏡像站點。國内主要開源的鏡像站點是網易和阿裡雲。

1、首先備份系統自帶 ​

​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複制代碼      

閱讀手冊

​Linux​

​ 指令種類繁雜,我們憑借記憶不可能全部記住,是以學會查用手冊是非常重要的。

man

安裝更新 man
sudo yum install -y man-pages --> 安裝sudo mandb --> 更新複制代碼      
man 手冊種類
  1. 可執行程式或​

    ​Shell​

    ​ 指令;
  2. 系統調用(​

    ​Linux​

    ​ 核心提供的函數);
  3. 庫調用(程式庫中的函數);
  4. 檔案(例如​

    ​/etc/passwd​

    ​ );
  5. 特殊檔案(通常在​

    ​/dev​

    ​ 下);
  6. 遊戲;
  7. 雜項(​

    ​man(7)​

    ​ ,​

    ​groff(7)​

    ​ );
  8. 系統管理指令(通常隻能被​

    ​root​

    ​ 使用者使用);
  9. 核心子程式。
man + 數字 + 指令

輸入 man + 數字 + 指令/函數,可以查到相關的指令和函數,若不加數字, ​

​man​

​ 預設從數字較小的手冊中尋找相關指令和函數

man 3 rand  --> 表示在手冊的第三部分查找 rand 函數man ls    --> 查找 ls 用法手冊複制代碼      

man 手冊核心區域解析:(以 ​

​man pwd​

​ 為例)

NAME # 指令名稱和簡單描述     pwd -- return working directory nameSYNOPSIS # 使用此指令的所有方法     pwd [-L | -P]DESCRIPTION # 包括所有參數以及用法     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 # 擴充閱讀相關指令     builtin(1), cd(1), csh(1), sh(1), getcwd(3)複制代碼      

help

​man​

​​ 指令像新華詞典一樣可以查詢到指令或函數的詳細資訊,但其實我們還有更加快捷的方式去查詢, ​

​command --help​

​​ 或 ​

​command -h​

​​ ,它沒有 ​

​man​

​ 指令顯示的那麼詳細,但是它更加易于閱讀。

Linux 進階

文本操作

grep

全局搜尋一個正規表達式,并且列印到螢幕。簡單來說就是,在檔案中查找關鍵字,并顯示關鍵字所在行。

基礎文法
grep text file # text代表要搜尋的文本,file代表供搜尋的檔案# 執行個體[root@lion ~]# grep path /etc/profilepathmunge () {    pathmunge /usr/sbin    pathmunge /usr/local/sbin    pathmunge /usr/local/sbin after    pathmunge /usr/sbin afterunset -f pathmunge複制代碼      
常用參數
  • ​-i​

    ​​ 忽略大小寫, ​

    ​grep -i path /etc/profile​

  • ​-n​

    ​​ 顯示行号,​

    ​grep -n path /etc/profile​

  • ​-v​

    ​​ 隻顯示搜尋文本不在的那些行,​

    ​grep -v path /etc/profile​

  • ​-r​

    ​​ 遞歸查找, ​

    ​grep -r hello /etc​

    ​ ,Linux 中還有一個 rgrep 指令,作用相當于 ​

    ​grep -r​

進階用法

​grep​

​ 可以配合正規表達式使用。

grep -E path /etc/profile --> 完全比對pathgrep -E ^path /etc/profile --> 比對path開頭的字元串grep -E [Pp]ath /etc/profile --> 比對path或Path複制代碼      

sort

對檔案的行進行排序。

基礎文法
sort name.txt # 對name.txt檔案進行排序複制代碼      
執行個體用法

為了示範友善,我們首先建立一個檔案 ​

​name.txt​

​ ,放入以下内容:

ChristopherShawnTedRockNoahZacharyBella複制代碼      

執行 ​

​sort name.txt​

​ 指令,會對文本内容進行排序。

常用參數
  • ​-o​

    ​​ 将排序後的檔案寫入新檔案, ​

    ​sort -o name_sorted.txt name.txt​

    ​ ;
  • ​-r​

    ​​ 倒序排序, ​

    ​sort -r name.txt​

    ​ ;
  • ​-R​

    ​​ 随機排序, ​

    ​sort -R name.txt​

    ​ ;
  • ​-n​

    ​​ 對數字進行排序,預設是把數字識别成字元串的,是以 138 會排在 25 前面,如果添加了 ​

    ​-n​

    ​ 數字排序的話,則 25 會在 138 前面。

wc

​word count​

​ 的縮寫,用于檔案的統計。它可以統計單詞數目、行數、字元數,位元組數等。

基礎文法
wc name.txt # 統計name.txt複制代碼      
執行個體用法
[root@lion ~]# wc name.txt 13 13 91 name.txt複制代碼      
  • 第一個13,表示行數;
  • 第二個13,表示單詞數;
  • 第三個91,表示位元組數。
常用參數
  • ​-l​

    ​​ 隻統計行數, ​

    ​wc -l name.txt​

    ​ ;
  • ​-w​

    ​​ 隻統計單詞數, ​

    ​wc -w name.txt​

    ​ ;
  • ​-c​

    ​​ 隻統計位元組數, ​

    ​wc -c name.txt​

    ​ ;
  • ​-m​

    ​​ 隻統計字元數, ​

    ​wc -m name.txt​

    ​ 。

uniq

删除檔案中的重複内容。

基礎文法
uniq name.txt # 去除name.txt重複的行數,并列印到螢幕上uniq name.txt uniq_name.txt # 把去除重複後的檔案儲存為 uniq_name.txt複制代碼      

【注意】它隻能去除連續重複的行數。

常用參數
  • ​-c​

    ​​ 統計重複行數, ​

    ​uniq -c name.txt​

    ​ ;
  • ​-d​

    ​​ 隻顯示重複的行數, ​

    ​uniq -d name.txt​

    ​ 。

cut

剪切檔案的一部分内容。

基礎文法
cut -c 2-4 name.txt # 剪切每一行第二到第四個字元複制代碼      
常用參數
  • ​-d​

    ​​ 用于指定用什麼分隔符(比如逗号、分号、雙引号等等) ​

    ​cut -d , name.txt​

    ​ ;
  • ​-f​

    ​​ 表示剪切下用分隔符分割的哪一塊或哪幾塊區域, ​

    ​cut -d , -f 1 name.txt​

    ​ 。

重定向 管道 流

在 ​

​Linux​

​​ 中一個指令的去向可以有3個地方:終端、檔案、作為另外一個指令的入參。

2萬字系統總結,帶你實作Linux指令自由

指令一般都是通過鍵盤輸入,然後輸出到終端、檔案等地方,它的标準用語是 ​​

​stdin​

​​ 、 ​

​stdout​

​​ 以及 ​

​stderr​

​ 。

  • 标準輸入​

    ​stdin​

    ​ ,終端接收鍵盤輸入的指令,會産生兩種輸出;
  • 标準輸出​

    ​stdout​

    ​ ,終端輸出的資訊(不包含錯誤資訊);
  • 标準錯誤輸出​

    ​stderr​

    ​ ,終端輸出的錯誤資訊。
2萬字系統總結,帶你實作Linux指令自由

重定向

把本來要顯示在終端的指令結果,輸送到别的地方(到檔案中或者作為其他指令的輸入)。

輸出重定向 ​>​

​>​

​​ 表示重定向到新的檔案, ​

​cut -d , -f 1 notes.csv > name.csv​

​​ ,它表示通過逗号剪切​

​notes.csv​

​​ 檔案(剪切完有3個部分)擷取第一個部分,重定向到 ​

​name.csv​

​ 檔案。

我們來看一個具體示例,學習它的使用,假設我們有一個檔案 ​

​notes.csv​

​ ,檔案内容如下:

Mark1,951/100,很不錯1Mark2,952/100,很不錯2Mark3,953/100,很不錯3Mark4,954/100,很不錯4Mark5,955/100,很不錯5Mark6,956/100,很不錯6複制代碼      

執行指令:​

​cut -d , -f 1 notes.csv > name.csv​

​ 最後輸出如下内容:

Mark1Mark2Mark3Mark4Mark5Mark6複制代碼      

【注意】使用 ​

​>​

​ 要注意,如果輸出的檔案不存在它會建立一個,如果輸出的檔案已經存在,則會覆寫。是以執行這個操作要非常小心,以免覆寫其它重要檔案。

輸出重定向 ​>>​

表示重定向到檔案末尾,是以它不會像 ​

​>​

​ 指令這麼危險,它是追加到檔案的末尾(當然如果檔案不存在,也會被建立)。

再次執行 ​

​cut -d , -f 1 notes.csv >> name.csv​

​​ ,則會把名字追加到 ​

​name.csv​

​ 裡面。

Mark1Mark2Mark3Mark4Mark5Mark6Mark1Mark2Mark3Mark4Mark5Mark6複制代碼      

我們平時讀的 ​

​log​

​ 日志檔案其實都是用這個指令輸出的。

輸出重定向 ​2>​

标準錯誤輸出

cat not_exist_file.csv > res.txt 2> errors.log複制代碼      
  • 當我們​

    ​cat​

    ​ 一個檔案時,會把檔案内容列印到螢幕上,這個是标準輸出;
  • 當使用了​

    ​> res.txt​

    ​ 時,則不會列印到螢幕,會把标準輸出寫入檔案 ​

    ​res.txt​

    ​ 檔案中;
  • ​2> errors.log​

    ​​ 當發生錯誤時會寫入 ​

    ​errors.log​

    ​ 檔案中。
輸出重定向 ​2>>​

标準錯誤輸出(追加到檔案末尾)同 ​

​>>​

​ 相似。

輸出重定向 ​2>&1​

标準輸出和标準錯誤輸出都重定向都一個地方

cat not_exist_file.csv > res.txt 2>&1  # 覆寫輸出cat not_exist_file.csv >> res.txt 2>&1 # 追加輸出複制代碼      

目前為止,我們接觸的指令的輸入都來自指令的參數,其實指令的輸入還可以來自檔案或者鍵盤的輸入。

2萬字系統總結,帶你實作Linux指令自由

未命名檔案 (2).png

輸入重定向 ​<​

​<​

​ 符号用于指定指令的輸入。

cat < name.csv # 指定指令的輸入為 name.csv複制代碼      

雖然它的運作結果與 ​

​cat name.csv​

​ 一樣,但是它們的原理卻完全不同。

  • ​cat name.csv​

    ​​ 表示 ​

    ​cat​

    ​ 指令接收的輸入是 ​

    ​notes.csv​

    ​ 檔案名,那麼要先打開這個檔案,然後列印出檔案内容。
  • ​cat < name.csv​

    ​​ 表示 ​

    ​cat​

    ​ 指令接收的輸入直接是 ​

    ​notes.csv​

    ​ 這個檔案的内容, ​

    ​cat​

    ​指令隻負責将其内容列印,打開檔案并将檔案内容傳遞給 ​

    ​cat​

    ​ 指令的工作則交給終端完成。
輸入重定向 ​<<​

将鍵盤的輸入重定向為某個指令的輸入。

sort -n << END # 輸入這個指令之後,按下回車,終端就進入鍵盤輸入模式,其中END為結束指令(這個可以自定義)wc -m << END # 統計輸入的單詞複制代碼      

管道 ​|​

把兩個指令連起來使用,一個指令的輸出作為另外一個指令的輸入,英文是 ​

​pipeline​

​ ,可以想象一個個水管連接配接起來,管道算是重定向流的一種。

2萬字系統總結,帶你實作Linux指令自由

未命名檔案 (1).png

舉幾個實際用法案例:

cut -d , -f 1 name.csv | sort > sorted_name.txt # 第一步擷取到的 name 清單,通過管道符再進行排序,最後輸出到sorted_name.txtdu | sort -nr | head # du 表示列舉目錄大小資訊# sort 進行排序,-n 表示按數字排序,-r 表示倒序# head 前10行檔案grep log -Ir /var/log | cut -d : -f 1 | sort | uniq# grep log -Ir /var/log 表示在log檔案夾下搜尋 /var/log 文本,-r 表示遞歸,-I 用于排除二進制檔案# cut -d : -f 1 表示通過冒号進行剪切,擷取剪切的第一部分# sort 進行排序# uniq 進行去重複制代碼      

流并非一個指令,在計算機科學中,流 ​

​stream​

​ 的含義是比較難了解的,記住一點即可:流就是讀一點資料, 處理一點點資料。其中資料一般就是二進制格式。 上面提及的重定向或管道,就是把資料當做流去運轉的。

到此我們就接觸了,流、重定向、管道等 ​

​Linux​

​​ 進階概念及指令。其實你會發現關于流和管道在其它語言中也有廣泛的應用。​

​Angular​

​​ 中的模闆文法中可以使用管道。​

​Node.js​

​​ 中也有​

​stream​

​ 流的概念。

檢視程序

在 ​

​Windows​

​​ 中通過 ​

​Ctrl + Alt + Delete​

​ 快捷鍵檢視軟體程序。

w

幫助我們快速了解系統中目前有哪些使用者登入着,以及他們在幹什麼。

[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:表示目前時間up 25 days, 9:53:表示系統已經正常運作了“25天9小時53分鐘”1 user:表示一個使用者load average: 0.00, 0.01, 0.05:表示系統的負載,3個值分别表示“1分鐘的平均負載”,“5分鐘的平均負載”,“15分鐘的平均負載” USER:表示登入的用于 TTY:登入的終端名稱為pts/0 FROM:連接配接到伺服器的ip位址 LOGIN@:登入時間 IDLE:使用者有多久沒有活躍了 JCPU:該終端所有相關的程序使用的 CPU 時間,每當程序結束就停止計時,開始新的程序則會重新計時 PCPU:表示 CPU 執行目前程式所消耗的時間,目前程序就是在 WHAT 列裡顯示的程式 WHAT:表示當下使用者正運作的程式是什麼,這裡我運作的是 w複制代碼      

ps

用于顯示目前系統中的程序, ​

​ps​

​​ 指令顯示的程序清單不會随時間而更新,是靜态的,是運作 ​

​ps​

​ 指令那個時刻的狀态或者說是一個程序快照。

基礎文法
[root@lion ~]# ps  PID TTY          TIME CMD 1793 pts/0    00:00:00 bash 4756 pts/0    00:00:00 ps  PID:程序号,每個程序都有唯一的程序号 TTY:程序運作所在的終端 TIME:程序運作時間 CMD:産生這個程序的程式名,如果在程序清單中看到有好幾行都是同樣的程式名,那麼就是同樣的程式産生了不止一個程序複制代碼      
常用參數
  • ​-ef​

    ​ 列出所有程序;
  • ​-efH​

    ​ 以喬木狀列舉出所有程序;
  • ​-u​

    ​ 列出此使用者運作的程序;
  • ​-aux​

    ​​ 通過 ​

    ​CPU​

    ​ 和記憶體使用來過濾程序 ​

    ​ps -aux | less​

    ​ ;
  • ​-aux --sort -pcpu​

    ​​ 按 ​

    ​CPU​

    ​ 使用降序排列, ​

    ​-aux --sort -pmem​

    ​ 表示按記憶體使用降序排列;
  • ​-axjf​

    ​​ 以樹形結構顯示程序, ​

    ​ps -axjf​

    ​ 它和 ​

    ​pstree​

    ​ 效果類似。

top

擷取程序的動态清單。

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​

    ​​ 相當 ​

    ​w​

    ​指令的第一行的資訊。
  • 展示的這些程序是按照使用處理器​

    ​%CPU​

    ​ 的使用率來排序的。

kill

結束一個程序, ​

​kill + PID​

​ 。

kill 956 # 結束程序号為956的程序kill 956 957 # 結束多個程序kill -9 7291 # 強制結束程序複制代碼      

管理程序

程序狀态

主要是切換程序的狀态。我們先了解下 ​

​Linux​

​ 下程序的五種狀态:

  1. 狀态碼​

    ​R​

    ​ :表示正在運作的狀态;
  2. 狀态碼​

    ​S​

    ​ :表示中斷(休眠中,受阻,當某個條件形成後或接受到信号時,則脫離該狀态);
  3. 狀态碼​

    ​D​

    ​ :表示不可中斷(程序不響應系統異步信号,即使用kill指令也不能使其中斷);
  4. 狀态碼​

    ​Z​

    ​ :表示僵死(程序已終止,但程序描述符依然存在,直到父程序調用 ​

    ​wait4()​

    ​系統函數後将程序釋放);
  5. 狀态碼​

    ​T​

    ​ :表示停止(程序收到 ​

    ​SIGSTOP​

    ​ 、 ​

    ​SIGSTP​

    ​ 、 ​

    ​SIGTIN​

    ​ 、 ​

    ​SIGTOU​

    ​ 等停止信号後停止運作)。

前台程序 & 背景程序

預設情況下,使用者建立的程序都是前台程序,前台程序從鍵盤讀取資料,并把處理結果輸出到顯示器。例如運作 ​

​top​

​ 指令,這就是一個一直運作的前台程序。

背景程序的優點是不必等待程式運作結束,就可以輸入其它指令。在需要執行的指令後面添加​

​&​

​ 符号,就表示啟動一個背景程序。

&

啟動背景程序,它的缺點是背景程序與終端相關聯,一旦關閉終端,程序就自動結束了。

cp name.csv name-copy.csv &複制代碼      

nohup

使程序不受挂斷(關閉終端等動作)的影響。

nohup cp name.csv name-copy.csv複制代碼      

​nohup​

​​ 指令也可以和 ​

​&​

​ 結合使用。

nohup cp name.csv name-copy.csv &複制代碼      

bg

使一個“背景暫停運作”的程序,狀态改為“背景運作”。

bg %1 # 不加任何參數的情況下,bg指令會預設作用于最近的一個背景程序,如果添加參數則會作用于指定标号的程序複制代碼      

實際案例1:

1. 執行 grep -r "log" / > grep_log 2>&1 指令啟動一個前台程序,并且忘記添加 & 符号2. ctrl + z 使程序狀态轉為背景暫停3. 執行 bg 将指令轉為背景運作複制代碼      

實際案例2:

前端開發時我們經常會執行 yarn start 啟動項目此時我們執行 ctrl + z 先使其暫停然後執行 bg 使其轉為背景運作這樣目前終端就空閑出來可以幹其它事情了,如果想要喚醒它就使用 fg 指令即可(後面會講)複制代碼      

jobs

顯示目前終端背景程序狀态。

[root@lion ~]# jobs[1]+  Stopped                 top[2]-  Running                 grep --color=auto -r "log" / > grep_log 2>&1 &複制代碼      

fg

​fg​

​​ 使程序轉為前台運作,用法和 ​

​bg​

​ 指令類似。

我們用一張圖來表示前背景程序切換:

2萬字系統總結,帶你實作Linux指令自由

我們可以使程式在背景運作,成為背景程序,這樣在目前終端中我們就可以做其他事情了,而不必等待此程序運作結束。

守護程序

一個運作起來的程式被稱為程序。在 ​

​Linux​

​​ 中有些程序是特殊的,它不與任何程序關聯,不論使用者的身份如何,都在背景運作,這些程序的父程序是 ​

​PID​

​​ 為1的程序, ​

​PID​

​​ 為1的程序隻在系統關閉時才會被銷毀。它們會在背景一直運作等待配置設定工作。我們将這類程序稱之為守護程序 ​

​daemon​

​ 。

守護程序的名字通常會在最後有一個 ​

​d​

​​ ,表示 ​

​daemon​

​​ 守護的意思,例如 ​

​systemd​

​​、​

​httpd​

​ 。

systemd

​systemd​

​​ 是一個 ​

​Linux​

​​ 系統基礎元件的集合,提供了一個系統和服務管理器,運作為 ​

​PID 1​

​ 并負責啟動其它程式。

[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複制代碼      

通過指令也可以看到 ​

​PID​

​​ 為1的程序就是 ​

​systemd​

​ 的系統程序。

​systemd​

​ 常用指令(它是一組指令的集合):

systemctl start nginx # 啟動服務systemctl stop nginx # 停止服務systemctl restart nginx # 重新開機服務systemctl status nginx # 檢視服務狀态systemctl reload nginx # 重載配置檔案(不停止服務的情況)systemctl enable nginx # 開機自動啟動服務systemctl disable nginx # 開機不自動啟動服務systemctl is-enabled nginx # 檢視服務是否開機自動啟動systemctl list-unit-files --type=service # 檢視各個級别下服務的啟動和禁用情況複制代碼      

檔案壓縮解壓

  • 打包:是将多個檔案變成一個總的檔案,它的學名叫存檔、歸檔。
  • 壓縮:是将一個大檔案(通常指歸檔)壓縮變成一個小檔案。

我們常常使用 ​

​tar​

​​ 将多個檔案歸檔為一個總的檔案,稱為 ​

​archive​

​​ 。然後用 ​

​gzip​

​​ 或 ​

​bzip2​

​​ 指令将 ​

​archive​

​ 壓縮為更小的檔案。

2萬字系統總結,帶你實作Linux指令自由

未命名檔案.png

tar

建立一個 ​

​tar​

​ 歸檔。

基礎用法
tar -cvf sort.tar sort/ # 将sort檔案夾歸檔為sort.tartar -cvf archive.tar file1 file2 file3 # 将 file1 file2 file3 歸檔為archive.tar複制代碼      
常用參數
  • ​-cvf​

    ​​ 表示 ​

    ​create​

    ​(建立)+ ​

    ​verbose​

    ​(細節)+ ​

    ​file​

    ​(檔案),建立歸檔檔案并顯示操作細節;
  • ​-tf​

    ​ 顯示歸檔裡的内容,并不解開歸檔;
  • ​-rvf​

    ​​ 追加檔案到歸檔, ​

    ​tar -rvf archive.tar file.txt​

    ​ ;
  • ​-xvf​

    ​​ 解開歸檔, ​

    ​tar -xvf archive.tar​

    ​ 。

gzip / gunzip

“壓縮/解壓”歸檔,預設用 ​

​gzip​

​​ 指令,壓縮後的檔案字尾名為 ​

​.tar.gz​

​ 。

gzip archive.tar # 壓縮gunzip archive.tar.gz # 解壓複制代碼      

tar 歸檔+壓縮

可以用 ​

​tar​

​​ 指令同時完成歸檔和壓縮的操作,就是給 ​

​tar​

​​ 指令多加一個選項參數,使之完成歸檔操作後,還是調用 ​

​gzip​

​​ 或 ​

​bzip2​

​ 指令來完成壓縮操作。

tar -zcvf archive.tar.gz archive/ # 将archive檔案夾歸檔并壓縮tar -zxvf archive.tar.gz # 将archive.tar.gz歸檔壓縮檔案解壓複制代碼      

zcat、zless、zmore

之前講過使用 ​

​cat less more​

​​ 可以檢視檔案内容,但是壓縮檔案的内容是不能使用這些指令進行檢視的,而要使用 ​

​zcat、zless、zmore​

​ 進行檢視。

zcat archive.tar.gz複制代碼      

zip/unzip

“壓縮/解壓” ​

​zip​

​​ 檔案( ​

​zip​

​​ 壓縮檔案一般來自 ​

​windows​

​ 作業系統)。

指令安裝
# Red Hat 一族中的安裝方式yum install zip yum install unzip 複制代碼      
基礎用法
unzip archive.zip # 解壓 .zip 檔案unzip -l archive.zip # 不解開 .zip 檔案,隻看其中内容zip -r sort.zip sort/ # 将sort檔案夾壓縮為 sort.zip,其中-r表示遞歸複制代碼      

編譯安裝軟體

之前我們學會了使用 ​

​yum​

​​ 指令進行軟體安裝,如果碰到 ​

​yum​

​ 倉庫中沒有的軟體,我們就需要會更進階的軟體安裝“源碼編譯安裝”。

編譯安裝

簡單來說,編譯就是将程式的源代碼轉換成可執行檔案的過程。大多數 ​

​Linux​

​ 的程式都是開放源碼的,可以編譯成适合我們的電腦和操縱系統屬性的可執行檔案。

基本步驟如下:

  1. 下載下傳源代碼
  2. 解壓壓縮包
  3. 配置
  4. 編譯
  5. 安裝
實際案例

1、下載下傳

我們來編譯安裝 ​

​htop​

​ 軟體,首先在它的官網下載下傳源碼:bintray.com/htop/source…[1]

下載下傳好的源碼在本機電腦上使用如下指令同步到伺服器上:

scp 檔案名 使用者名@伺服器ip:目标路徑scp ~/Desktop/htop-3.0.0.tar.gz [email protected]:.複制代碼      

也可以使用 ​

​wegt​

​ 進行下載下傳:

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 # 進入目錄複制代碼      

3、配置

執行 ​

​./configure​

​ ,它會分析你的電腦去确認編譯所需的工具是否都已經安裝了。

4、編譯

執行 ​

​make​

​ 指令

5、安裝

執行 ​

​make install​

​​ 指令,安裝完成後執行 ​

​ls /usr/local/bin/​

​​ 檢視是否有 ​

​htop​

​​ 指令。如果有就可以執行 ​

​htop​

​ 指令檢視系統程序了。

網絡

ifconfig

檢視 ​

​ip​

​​ 網絡相關資訊,如果指令不存在的話, 執行指令 ​

​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複制代碼      

參數解析:

  • ​eth0​

    ​​ 對應有線連接配接(對應你的有線網卡),就是用網線來連接配接的上網。​

    ​eth​

    ​ 是 ​

    ​Ethernet​

    ​ 的縮寫,表示“以太網”。有些電腦可能同時有好幾條網線連着,例如伺服器,那麼除了​

    ​eht0​

    ​ ,你還會看到 ​

    ​eth1​

    ​ 、 ​

    ​eth2​

    ​ 等。
  • ​lo​

    ​​ 表示本地回環( ​

    ​Local Loopback​

    ​ 的縮寫,對應一個虛拟網卡)可以看到它的 ​

    ​ip​

    ​ 位址是 ​

    ​127.0.0.1​

    ​ 。每台電腦都應該有這個接口,因為它對應着“連向自己的連結”。這也是被稱之為“本地回環”的原因。所有經由這個接口發送的東西都會回到你自己的電腦。看起來好像并沒有什麼用,但有時為了某些緣故,我們需要連接配接自己。例如用來測試一個網絡程式,但又不想讓區域網路或外網的使用者檢視,隻能在此台主機上運作和檢視所有的網絡接口。例如在我們啟動一個前端工程時,在浏覽器輸入 ​

    ​127.0.0.1:3000​

    ​ 啟動項目就能檢視到自己的 ​

    ​web​

    ​ 網站,并且它隻有你能看到。
  • ​wlan0​

    ​ 表示無線區域網路(上面案例并未展示)。

host

​ip​

​ 位址和主機名的互相轉換。

軟體安裝
yum install bind-utils複制代碼      
基礎用法
[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 連接配接遠端伺服器

通過非對稱加密以及對稱加密的方式(同 ​

​HTTPS​

​ 安全連接配接原理相似)連接配接到遠端伺服器。

ssh 使用者@ip:port1、ssh [email protected]:22 # 端口号可以省略不寫,預設是22端口2、輸入連接配接密碼後就可以操作遠端伺服器了複制代碼      
配置 ssh

​config​

​​ 檔案可以配置 ​

​ssh​

​​ ,友善批量管理多個 ​

​ssh​

​ 連接配接。

配置檔案分為以下幾種:

  • 全局​

    ​ssh​

    ​ 服務端的配置:​

    ​/etc/ssh/sshd_config​

    ​ ;
  • 全局​

    ​ssh​

    ​ 用戶端的配置:​

    ​/etc/ssh/ssh_config​

    ​(很少修改);
  • 目前使用者​

    ​ssh​

    ​ 用戶端的配置:​

    ​~/.ssh/config​

    ​ 。

【服務端 ​

​config​

​ 檔案的常用配置參數】

服務端 config 參數 作用
Port sshd 服務端口号(預設是22)
PermitRootLogin 是否允許以 root 使用者身份登入(預設是可以)
PasswordAuthentication 是否允許密碼驗證登入(預設是可以)
PubkeyAuthentication 是否允許公鑰驗證登入(預設是可以)
PermitEmptyPasswords 是否允許空密碼登入(不安全,預設不可以)

[注意] 修改完服務端配置檔案需要重新開機服務 ​

​systemctl restart sshd​

【用戶端 ​

​config​

​ 檔案的常用配置參數】

用戶端 config 參數 作用
Host 别名
HostName 遠端主機名(或 IP 位址)
Port 連接配接到遠端主機的端口
User 使用者名

配置目前使用者的 ​

​config​

​ :

# 建立configvim ~/.ssh/config# 填寫一下内容Host lion # 别名 HostName 172.x.x.x # ip 位址  Port 22 # 端口  User root # 使用者複制代碼      

這樣配置完成後,下次登入時,可以這樣登入 ​

​ssh lion​

​​ 會自動識别為 ​

​root​

​ 使用者。

[注意] 這段配置不是在伺服器上,而是你自己的機器上,它僅僅是設定了一個别名。

免密登入

​ssh​

​ 登入分兩種,一種是基于密碼(賬号密碼),另外一種是基于密鑰的方式。

基于密碼,就是每次登入輸入賬号和密碼,顯然這樣做是比較麻煩的,今天主要學習如何基于密鑰實作免密登入。

基于密鑰驗證原理

客戶機生成密鑰對(公鑰和私鑰),把公鑰上傳到伺服器,每次登入會與伺服器的公鑰進行比較,這種驗證登入的方法更加安全,也被稱為“公鑰驗證登入”。

具體實作步驟

1、在客戶機中生成密鑰對(公鑰和私鑰) ​

​ssh-keygen​

​(預設使用 RSA 非對稱加密算法)

運作完 ​

​ssh-keygen​

​​ 會在 ​

​~/.ssh/​

​ 目錄下,生成兩個檔案:

  • ​id_rsa.pub​

    ​ :公鑰
  • ​id_rsa​

    ​ :私鑰

2、把客戶機的公鑰傳送到服務

執行 ​

​ssh-copy-id [email protected]

​​(​

​ssh-copy-id​

​​ 它會把客戶機的公鑰追加到伺服器 ​

​~/.ssh/authorized_keys​

​ 的檔案中)。

執行完成後,運作 ​

​ssh [email protected]

​ 就可以實作免密登入伺服器了。

配合上面設定好的别名,直接執行 ​

​ssh lion​

​ 就可以登入,是不是非常友善。

wget

可以使我們直接從終端控制台下載下傳檔案,隻需要給出檔案的HTTP或FTP位址。

wget [參數][URL位址]wget http://www.minjieren.com/wordpress-3.1-zh_CN.zip複制代碼      

​wget​

​​ 非常穩定,如果是由于網絡原因下載下傳失敗, ​

​wget​

​ 會不斷嘗試,直到整個檔案下載下傳完畢。

常用參數
  • ​-c​

    ​ 繼續中斷的下載下傳。

備份

scp

它是 ​

​Secure Copy​

​​ 的縮寫,表示安全拷貝。​

​scp​

​ 可以使我們通過網絡,把檔案從一台電腦拷貝到另一台電腦。

​scp​

​​ 是基于 ​

​ssh​

​​ 的原理來運作的, ​

​ssh​

​​ 會在兩台通過網絡連接配接的電腦之間建立一條安全通信的管道, ​

​scp​

​ 就利用這條管道安全地拷貝檔案。

scp source_file destination_file # source_file 表示源檔案,destination_file 表示目标檔案複制代碼      

其中 ​

​source_file​

​​ 和 ​

​destination_file​

​​ 都可以這樣表示:​

​user@ip:file_name​

​​ , ​

​user​

​​ 是登入名, ​

​ip​

​​ 是域名或 ​

​ip​

​​ 位址。​

​file_name​

​ 是檔案路徑。

scp file.txt [email protected]:/root # 表示把我的電腦中目前檔案夾下的 file.txt 檔案拷貝到遠端電腦scp [email protected]:/root/file.txt file.txt # 表示把遠端電腦上的 file.txt 檔案拷貝到本機複制代碼      

rsync

​rsync​

​​ 指令主要用于遠端同步檔案。它可以同步兩個目錄,不管它們是否處于同一台電腦。它應該是最常用于“增量備份”的指令了。它就是智能版的 ​

​scp​

​ 指令。

軟體安裝
yum install rsync複制代碼      
基礎用法
rsync -arv Images/ backups/ # 将Images 目錄下的所有檔案備份到 backups 目錄下rsync -arv Images/ [email protected]:backups/ # 同步到伺服器的backups目錄下複制代碼      
常用參數
  • ​-a​

    ​ 保留檔案的所有資訊,包括權限,修改日期等;
  • ​-r​

    ​ 遞歸調用,表示子目錄的所有檔案也都包括;
  • ​-v​

    ​ 備援模式,輸出詳細操作資訊。

預設地, ​

​rsync​

​​ 在同步時并不會删除目标目錄的檔案,例如你在源目錄中删除一個檔案,但是用 ​

​rsync​

​​ 同步時,它并不會删除同步目錄中的相同檔案。如果向删除也可以這麼做:​

​rsync -arv --delete Images/ backups/​

​ 。

系統

halt

關閉系統,需要 ​

​root​

​ 身份。

halt複制代碼      

reboot

重新開機系統,需要 ​

​root​

​ 身份。

reboot
複制代碼      

poweroff

直接運作即可關機,不需要 ​

​root​

​ 身份。

Vim 編輯器

Vim 是什麼?

​Vim​

​​ 是從 ​

​vi​

​​ 發展出來的一個文本編輯器。其代碼補完、編譯及錯誤跳轉等友善程式設計的功能特别豐富,在程式員中被廣泛使用。和 ​

​Emacs​

​​ 并列成為類 ​

​Unix​

​ 系統使用者最喜歡的編輯器。

Vim 常用模式

  • 互動模式
  • 插入模式
  • 指令模式
  • 可視模式

互動模式

也成為正常模式,這是 ​

​Vim​

​​ 的預設模式,每次運作 ​

​Vim​

​ 程式的時候,就會進入這個模式。

例如執行 ​

​vim name.txt​

​ 則會進入互動模式。

互動模式特征:

  • 在這個模式下,你不能輸入文本;
  • 它可以讓我們在文本間移動,删除一行文本,複制黏貼文本,跳轉到指定行,撤銷操作,等等。

插入模式

這個模式是我們熟悉的文本編輯器的模式,就是可以輸入任何你想輸入的内容。進入這個模式有幾種方法,最常用的方法是按字母鍵 ​

​i​

​​ ( ​

​i、I、a、A、o、O​

​​ 都可以進入插入模式,隻是所處的位置不同),退出這種模式,隻需要按下 ​

​Esc​

​ 鍵。

  • ​i, I​

    ​​ 進入輸入模式 ​

    ​Insert mode​

    ​ :​

    ​i​

    ​ 為“從目前光标所在處輸入”, ​

    ​I​

    ​ 為“在目前所在行的第一個非空格符處開始輸入”;
  • ​a, A​

    ​​ 進入輸入模式 ​

    ​Insert mode​

    ​ :​

    ​a​

    ​ 為“從目前光标所在的下一個字元處開始輸入”,​

    ​A​

    ​ 為“從光标所在行的最後一個字元處開始輸入”;
  • ​o, O​

    ​​ 進入輸入模式 ​

    ​Insert mode​

    ​ :​

    ​o​

    ​ 為“在目前光标所在的下一行處輸入新的一行”;​

    ​O​

    ​ 為在目前光标所在處的上一行輸入新的一行。

指令模式

指令模式也稱為底線指令模式,這個模式下可以運作一些指令例如“退出”,“儲存”,等動作。

也可以用這個模式來激活一些 ​

​Vim​

​​ 配置,例如文法高亮,顯示行号,等。甚至還可以發送一些指令給終端指令行,例如 ​

​ls、cp​

​ 。

為了進入指令模式,首先要進入互動模式,再按下冒号鍵。

用一張圖表示三種模式如何切換:

2萬字系統總結,帶你實作Linux指令自由

基本操作

打開 Vim

在終端指令行中輸入 ​

​vim​

​​ 回車後 ​

​Vim​

​​ 就會被運作起來,也可以用 ​

​Vim​

​​ 來打開一個檔案,隻需要在 ​

​vim​

​​ 後面再加檔案名。如 ​

​vim file.name​

​ ,如果檔案不存在,那麼會被建立。

插入

進入檔案之後,此時處于互動模式,可以通過輸入 ​

​i​

​ 進入插入模式。

移動

在 ​

​Vim​

​ 的互動模式下,我們可以在文本中移動光标。

  • ​h​

    ​ 向左移動一個字元
  • ​j​

    ​ 向下移動一個字元
  • ​k​

    ​ 向上移動一個字元
  • ​i​

    ​ 向右移動一個字元

當然也可以使用四個方向鍵進行移動,效果是一樣的。

跳至行首和行末

  • 行首:在互動模式下,為了将光标定位到一行的開始位置,隻需要按下數字鍵​

    ​0​

    ​ 即可,鍵盤上的 ​

    ​Home​

    ​ 鍵也有相同效果。
  • 行末:在互動模式下,為了将光标定位到一行的末尾,隻需要按下美元符号鍵​

    ​$​

    ​ 即可,鍵盤上的 ​

    ​End​

    ​ 鍵也有相同效果。

按單詞移動

在互動模式下,按字母鍵 ​

​w​

​ 可以一個單詞一個單詞的移動。

退出檔案

在互動模式下,按下冒号鍵 ​

​:​

​​ 進入指令模式,再按下 ​

​q​

​ 鍵,就可以退出了。

如果在退出之前又修改了檔案,就直接想用 ​

​:q​

​​ 退出 ​

​Vim​

​​ ,那麼 ​

​Vim​

​ 會顯示一個紅字标明錯誤資訊。此時我們有兩個選擇:

  1. 儲存并退出​

    ​:wq​

    ​ 或 ​

    ​:x​

    ​ ;
  2. 不儲存且退出​

    ​:q!​

    ​ 。

标準操作

删除字元

在互動模式下,将光标定位到一個你想要删除的字元上,按下字母鍵 ​

​x​

​ 你會發現這個字元被删除了。

也可以一次性删除多個字元,隻需要在按 ​

​x​

​ 鍵之前輸入數字即可。

删除(剪切)單詞,行

  • 删除一行:連按兩次​

    ​d​

    ​ 來删除光标所在的那一行。
  • 删除多行:例如先輸入數字​

    ​2​

    ​ ,再按下 ​

    ​dd​

    ​ ,就會删除從光标所在行開始的兩行。
  • 删除一個單詞:将光标置于一個單詞的首字母處,然後按下​

    ​dw​

    ​ 。
  • 删除多個單詞:例如先按數字鍵​

    ​2​

    ​ 再按 ​

    ​dw​

    ​ 就可以删除兩個單詞了。
  • 從光标所在位置删除至行首:​

    ​d0​

    ​ 。
  • 從光标所在位置删除至行末:​

    ​d$​

    ​ 。

複制單詞,行

  • 複制行:按兩次​

    ​y​

    ​ 會把光标所在行複制到記憶體中,和 ​

    ​dd​

    ​ 類似, ​

    ​dd​

    ​ 用于“剪切”光标所在行。
  • 複制單詞:​

    ​yw​

    ​ 會複制一個單詞。
  • 複制到行末:​

    ​y$​

    ​ 是複制從光标所在處到行末的所有字元。
  • 複制到行首:​

    ​y0​

    ​ 是複制光标所在處到行首的所有字元。

粘貼

如果之前用 ​

​dd​

​​ 或者 ​

​yy​

​​ 剪切複制過來的,可以使用 ​

​p​

​​ 來粘貼。同樣也可以使用 ​

​數字+p​

​來表示複制多次。

替換一個字元

在互動模式下,将光标置于想要替換的字元上。按下 ​

​r​

​ 鍵,接着輸入你要替換的字元即可。

撤銷操作

如果要撤銷最近的修改,隻需要按下 ​

​u​

​​ 鍵,如果想要撤銷最近四次修改,可以按下4,再按下 ​

​u​

​ 。

重做

取消撤銷,也就是重做之前的修改使用 ​

​ctrl + r​

​ 。

跳轉到指定行

​Vim​

​ 編輯的檔案中,每一行都有一個行号,行号從1開始,逐一遞增。

行号預設是不顯示,如果需要它顯示的話,可以進入指令模式,然後輸入 ​

​set nu​

​​ ,如果要隐藏行号的話,使用 ​

​set nonu​

​ 。

  • 跳轉到指定行:​

    ​數字+gg​

    ​ ,例如 ​

    ​7gg​

    ​ ,表示跳轉到第7行。
  • 要跳轉到最後一行,按下​

    ​G​

    ​ 。
  • 要跳轉到第一行,按下​

    ​gg​

    ​ 。

進階操作

查找

處于互動模式下,按下 ​

​/​

​​ 鍵,那麼就進入查找模式,輸入你要查找的字元串,然後按下回車。光标就會跳轉到檔案中下一個查找到的比對處。如果字元串不存在,那麼會顯示 ​

​"pattern not found"​

​ 。

  • ​n​

    ​ 跳轉到下一個比對項;
  • ​N​

    ​ 跳轉到上一個比對項。

[注意] 用斜杠來進行的查找是從目前光标處開始向檔案尾搜尋,如果你要從目前光标處開始,向檔案頭搜尋則使用 ​

​?​

​​ ,當然也可以先按下 ​

​gg​

​ 跳轉到第一行在進行全文搜尋。

查找并替換

替換光标所在行第一個比對的字元串:

# 文法:s/舊字元串/新字元串# 執行個體:s/one/two複制代碼      

替換光标所在行所有舊字元串為新字元串:

# 文法:s/舊字元串/新字元串/g複制代碼      

替換第幾行到第幾行中所有字元串:

# 文法:n,m s/舊字元串/新字元串/g# 執行個體:2,4 s/one/two/g複制代碼      

最常用的就是全文替換了:

# 文法:%s/舊字元串/新字元串/g複制代碼      

合并檔案

可以用冒号 ​

​+r​

​​ ( ​

​:r​

​ ) 實作在光标處插入一個檔案的内容。

:r filename # 可以用Tab鍵來自動補全另外一個檔案的路徑
複制代碼      

分屏

​Vim​

​​ 有一個特别便捷的功能那就是分屏,可以同時打開好幾個檔案,分屏之後,螢幕每一塊被稱為一個 ​

​viewport​

​ ,表示“視口”。

  • 橫向分屏​

    ​:sp 檔案名​

  • 垂直分屏​

    ​:vsp 檔案名​

分屏模式下的快捷鍵
  • ​Ctrl + w​

    ​​ 再加 ​

    ​Ctrl + w​

    ​ ,表示從一個 ​

    ​viewport​

    ​ 移動光标到另外一個 ​

    ​viewport​

    ​ ;
  • ​Ctrl + w​

    ​ 再加 “方向鍵”,就可以移動到這個方向所處的下一個視口了;
  • ​Ctrl + w​

    ​​ 再加 ​

    ​+​

    ​ 号,表示擴大目前視口;
  • ​Ctrl + w​

    ​​ 再加 ​

    ​-​

    ​ 号,表示縮小目前視口;
  • ​Ctrl + w​

    ​​ 再加 ​

    ​=​

    ​ 号,表示平均目前視口;
  • ​Ctrl + w​

    ​​ 再加 ​

    ​r​

    ​ 鍵,會反向調換視口位置;
  • ​Ctrl + w​

    ​​ 再加 ​

    ​q​

    ​ 鍵,會關閉目前視口;
  • ​Ctrl + w​

    ​​ 再加 ​

    ​o​

    ​ 鍵,會關閉除目前視口以外的所有視口;

運作外部指令 ​:!​

在 ​

​Vim​

​​ 中可以運作一些終端指令,隻要先輸入 ​

​:!​

​ ,然後接指令名稱。

例如:

:!ls # 在Vim中打開的檔案所在的目錄運作ls指令
複制代碼      

可視模式

前面隻講了 ​

​Vim​

​ 的三種模式,其實還有一種模式叫做可視模式。

進入它的三種方式(都是從互動模式開始):

  • ​v​

    ​​ 字元可視模式,進入後配合方向鍵選中字元後,然後再按 ​

    ​d​

    ​ 鍵可以删除選中。
  • ​V​

    ​​ 行可視模式,進入後光标所在行預設被選中,然後再按 ​

    ​d​

    ​ 鍵可以删除所在行。
  • ​Ctrl + v​

    ​​ 塊可視模式,它是可視模式最有用的功能了,配合 ​

    ​d​

    ​ 和 ​

    ​I​

    ​ 鍵可以實作删除選中的内容和插入内容。

同時選中多行,并在選中行頭部插入内容的具體操作步驟:

1. ctrl + v 進入塊可視模式
2. 使用方向鍵進行選中(上下左右)假設選中5行
3. 輸入 I 鍵進行多行同時插入操作
4. 插入完成後連續按兩下 esc 鍵,實作多行同時插入相同字元
複制代碼      

進入可視模式之後的操作鍵:

  • ​d​

    ​ 鍵,表示删除選中;
  • ​I​

    ​ 鍵,表示在選中之前插入;
  • ​u​

    ​ 鍵,表示選中變為小寫;
  • ​U​

    ​ 鍵,表示選中變為大寫;

Vim 配置

選項參數

在 ​

​Vim​

​​ 被啟動後,可以運作一些指令來激活一些選項參數,但是這些選項參數的配置在退出​

​Vim​

​​ 時會被忘記,例如前面講解的激活行号。如果希望所在的配置是永久性的,那麼需要在家目錄( ​

​cd ~​

​​ )建立一個 ​

​Vim​

​​ 的配置檔案 ​

​.vimrc​

​ 。

.vimrc

set number " 顯示行号
syntax on " 激活文法高亮
set showcmd " 實時看到輸入的指令
set ignorecase " 搜尋時不區分大小寫
set mouse=a " 激活滑鼠,用滑鼠選中時相當于進入可視模式
複制代碼      

​Vim​

​​ 配置非常豐富,我們可以通過個性化配置把 ​

​Vim​

​​ 打造成屬于自己的 ​

​IDE​

​​ 等等。在 ​

​github​

​​ 上也可以搜尋到一些強大的 ​

​Vim​

​ 配置檔案。

總結

相信通過本文的學習,你應該會對 ​

​Linux​

​ 有一個更加全面的認識。

都看到這裡了,就點個👍 👍 👍 吧。​

參考資料

繼續閱讀