​2 萬字系統總結,帶你實現 Linux 命令自由?

語言: CN / TW / HK

點選進入“PHP開源社群”    

免費獲取進階面試、文件、影片資源

前言

Linux 的學習對於一個程式設計師的重要性是不言而喻的。前端開發相比後端開發,接觸 Linux 機會相對較少,因此往往容易忽視它。但是學好它卻是程式設計師必備修養之一。

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

作者使用的是阿里雲伺服器 ECS (最便宜的那種)  CentOS 7.7 64位。當然你也可以在自己的電腦安裝虛擬機器,虛擬機器中再去安裝  CentOS 系統(這就完全免費了)。至於它的安裝教程可以去谷歌搜尋下,相關教程非常多。

Linux 基礎

作業系統

作業系統 Operating System 簡稱  OS ,是軟體的一部分,它是硬體基礎上的第一層軟體,是硬體和其它軟體溝通的橋樑。

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

什麼是 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
    

終端連線阿里雲伺服器

通過執行 ssh [email protected] 命令,然後輸入伺服器連線密碼就可以順利登陸遠端伺服器。從現在開始我們就可以在本地電腦操作遠端伺服器。

  1. 這個黑色的面板就是終端也就是  Shell (命令列環境)。
  2. ssh [email protected] 這是一條命令,必須要在  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 是目前最常用的  ShellMacOS 中的預設  Shell 就是  Bash

通過執行 echo $SHELL 命令可以檢視到當前正在使用的  Shell 。還可以通過  cat /etc/shells 檢視當前系統安裝的所有  Shell 種類。

命令

命令列提示符

進入命令列環境以後,使用者會看到 Shell 的提示符。提示符往往是一串字首,最後以一個美元符號  $ 結尾,使用者可以在這個符號後面輸入各種命令。

執行一個簡單的命令 pwd

[[email protected] ~]# 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 會話;

檔案和目錄

檔案的組織

檢視路徑

pwd

顯示當前目錄的路徑

which

檢視命令的可執行檔案所在路徑, Linux 下,每一條命令其實都對應一個可執行程式,在終端中輸入命令,按回車的時候,就是執行了對應的那個程式,  which 命令本身對應的程式也存在於  Linux 中。

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

瀏覽和切換目錄

ls

列出檔案和目錄,它是 Linux 最常用的命令之一。

【常用引數】

  • -a 顯示所有檔案和目錄包括隱藏的
  • -l 顯示詳細列表
  • -h 適合人類閱讀的
  • -t 按檔案最近一次修改時間排序
  • -i
    inode
    inode
    

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 鍵:後退一頁;
  • 回車鍵:前進一行;

  • 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
    -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 的硬連結複製程式碼

如果我們用 rm file1 來刪除  file1 ,對  file2 沒有什麼影響,對於硬連結來說,刪除任意一方的檔案,共同指向的檔案內容並不會從硬碟上刪除。只有同時刪除了  file1 與  file2 後,它們共同指向的檔案內容才會消失。

軟連結

軟連結就類似 windows 下快捷方式。

ln -s file1 file2複製程式碼

執行 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 ,是一個很特殊的使用者,它是超級使用者,擁有最高許可權。

自己建立的使用者是有限許可權的使用者,這樣大大提高了 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 的檔案許可權。

[[email protected] ~]# 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
  • rread 表示檔案可讀。
  • wwrite 表示檔案可寫,一般有寫的許可權,就有刪除的許可權。
  • xexecute 表示檔案可執行。
  • - :表示沒有相應許可權。

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

現在再來理解這句許可權 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-----複製程式碼

用字母來分配許可權

  • uuser 的縮寫,使用者的意思,表示所有者。
  • ggroup 的縮寫,群組的意思,表示群組使用者。
  • oother 的縮寫,其它的意思,表示其它使用者。
  • aall 的縮寫,所有的意思,表示所有使用者。
  • + :加號,表示新增許可權。
  • - :減號,表示去除許可權。
  • = :等於號,表示分配許可權。
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代表供搜尋的檔案# 例項[[email protected] ~]# 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
    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複製程式碼

例項用法

[[email protected] ~]# 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個地方:終端、檔案、作為另外一個命令的入參。 命令一般都是通過鍵盤輸入,然後輸出到終端、檔案等地方,它的標準用語是  stdin 、  stdout 以及  stderr

  • 標準輸入  stdin ,終端接收鍵盤輸入的命令,會產生兩種輸出;
  • 標準輸出  stdout ,終端輸出的資訊(不包含錯誤資訊);
  • 標準錯誤輸出  stderr ,終端輸出的錯誤資訊。

重定向

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

輸出重定向  >

> 表示重定向到新的檔案,  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).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 ,可以想象一個個水管連線起來,管道算是重定向流的一種。

未命名檔案 (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

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

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

ps

用於顯示當前系統中的程序, ps 命令顯示的程序列表不會隨時間而更新,是靜態的,是執行  ps 命令那個時刻的狀態或者說是一個程序快照。

基礎語法

[[email protected] ~]# 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

顯示當前終端後臺程序狀態。

[[email protected] ~]# jobs[1]+  Stopped                 top[2]-  Running                 grep --color=auto -r "log" / > grep_log 2>&1 &複製程式碼

fg

fg 使程序轉為前臺執行,用法和  bg 命令類似。

我們用一張圖來表示前後臺程序切換:

我們可以使程式在後臺執行,成為後臺程序,這樣在當前終端中我們就可以做其他事情了,而不必等待此程序執行結束。

守護程序

一個執行起來的程式被稱為程序。在 Linux 中有些程序是特殊的,它不與任何程序關聯,不論使用者的身份如何,都在後臺執行,這些程序的父程序是  PID 為1的程序,  PID 為1的程序只在系統關閉時才會被銷燬。它們會在後臺一直執行等待分配工作。我們將這類程序稱之為守護程序  daemon

守護程序的名字通常會在最後有一個 d ,表示  daemon 守護的意思,例如  systemdhttpd

systemd

systemd 是一個  Linux 系統基礎元件的集合,提供了一個系統和服務管理器,執行為  PID 1 並負責啟動其它程式。

[[email protected] ~]# 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 壓縮為更小的檔案。

未命名檔案.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]121.42.11.34:.複製程式碼

也可以使用 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 安裝。

[[email protected] ~]# 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複製程式碼

基礎用法

[[email protected] ~]# host github.combaidu.com has address 13.229.188.59 [[email protected] ~]# 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]172.20.10.1:22 # 埠號可以省略不寫,預設是222、輸入連線密碼後就可以操作遠端伺服器了複製程式碼

配置 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 都可以這樣表示: [email protected]:file_name ,  user 是登入名,  ip 是域名或  ip 地址。 file_name 是檔案路徑。

scp file.txt [email protected]192.168.1.5:/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]192.x.x.x: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

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

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

基本操作

開啟 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 有一個更加全面的認識。

都看到這裡了,就點個:+1: :+1: :+1: 吧。

原文連結:https://juejin.cn/post/6938385978004340744

END

PHP開源社群

掃描關注  進入”PHP資料“

免費獲取進階

面試、文件、影片資源