# 那些沒人教你又超實用的 Linux 指令

- 作者：林鼎淵（Dean Lin）
- 網址：https://deanlin.net/blog/202208/useful-linux-commands/
- 發布：2022-08-17
- 主題：技術教學
- 標籤：Linux、Command Line、Ubuntu、Technology、Terminal
- 摘要：儘管在 Linux 用 cd、vi、mv、cp、rm、ls 這些基礎指令就能滿足大部分的需求，但遇到一些特殊狀況時，這些指令就不夠用了。這篇文章彙整了筆者常用的 Linux 指令，以「vim 編輯器、查詢 Server 各項資源、檢查網路環境」為主。

儘管在 Linux 用 cd、vi、mv、cp、rm、ls 這些基礎指令就能滿足大部分的需求，但遇到一些特殊狀況時，這些指令就不夠用了。

這篇文章彙整了筆者常用的 Linux 指令，以「vim 編輯器、查詢 Server 各項資源、檢查網路環境」為主。

```
大綱
 vim 編輯器常用指令
 ➤ 顯示行數（:set number）
 ➤ 前往指定行數（:行數）
 ➤ 刪除多行
 ➤ 大量註解/反註解
 ➤ 搜尋文字並取代
 查詢 Server 各項資源
 ➤ Server 啟動多久了（uptime）
 ➤ 找出最耗費資源的程式（top）
 ➤ 以目錄形式呈現目前磁碟使用狀況（ncdu）
 ➤ 搜尋檔案（find）
 ➤ 搜尋歷史指令（Control+R）
 檢查網路環境
 ➤ 網路診斷瑞士刀（nc）
 ➤ 設定好 DNS 後，確認回應是否正常（nslookup）
 ➤ 查詢佔用的 port（lsof）

```

## vim 編輯器常用指令

有時我們會需要進入 Server 做一些緊急調整（ex：Debug 時），搭配下面的操作可以增進你的效率。

### 顯示行數（:set number）

方便與 Local 端程式做比對。

### 前往指定行數（:行數）

直接跳轉到你要修改的位置。

### 刪除多行

刪除一行的指令是「`dd`」，但如果有幾十行甚至上百行需要刪除，那會 dd 到崩潰，而且很容易有誤刪的情形。

- 刪除從游標開始的 N 行（ex：刪除 5 行就是 `5dd`）

  可以觀察右下角，會看到我的輸入

- 刪除指定開始、結束的行 `:[start],[end]d` （ex：刪除第 3~17 行 `3,17d`）

### 大量註解/反註解

有時我們不是要刪除程式，只是想要把一定範圍內的程式註解起來做一些測試或是 Debug，如果你依靠「`i`」來慢慢編輯，真的會心死。

- **大量註解**：先將游標移至想開始註解的行，按「Control+v」進入 VISUAL BLOCK 模式，接著選擇想要註解的區塊；按下「Shift+i」進入編輯模式填寫註解符號（ex：`//`），按「Esc」離開。

- **反註解**：先將游標移至想開始註解的行，按「Control+v」進入 VISUAL BLOCK 模式，接著選擇想要反註解的區塊（因為我的註解用`//`所以要按右鍵刪除兩列）；按下「d」刪除註解。

### 搜尋文字並取代

```
:[範圍]s/[比對字串]/[取代字串]/g

```

- 將全部的「test」取代為「try」： `:%s/test/try/g`

- 將 1~10 行的「test」取代為「try」：`:1,10s/test/try/g`

## 查詢 Server 各項資源

了解資源的使用狀況，可以幫你更快地找出問題點，與優化方向。

### Server 啟動多久了（uptime）

- **21:21:33**：系統時間
- **up 6 days, 7:40**：Server 已執行時間，時間越大代表越穩定。
- **1 user**：使用者總連線數（注意不是使用者數！）。
- **load average：**系統平均負載狀況，顯示1 / 5 / 15 分鐘的系統平均負載（以單核 CPU 來說，建議數值不大於 3，超過 5 就需要注意了）。

### 找出最耗費資源的程式（top）

`top` 這個指令會顯示 Server 即時的資源使用狀況。

top 也可以指定欄位做排序，以下面的指令（ `top -b -o +%MEM | head -n 17`）為例，他是指：

- **-b**：以 batch 模式輸出報表。
- **-o**：我們使用「%MEM」這個欄位，以「正序」來排序。
- **head -n 17**：因為上面的資訊就佔了 7 行，所以你想要顯示前 10 名就要用 10+7=17。

> 在找出最耗費資源的程式後，有時會搭配 `kill [PID]` 的方式來終止程式；如果無法順利終止，可使用 `kill -9 [PID]` 來強行終止。

### 以目錄形式呈現目前磁碟使用狀況（ncdu）

如果發現磁碟空間快滿了，又不確定哪個資料夾佔用了大量空間，`ncdu` 可以幫你高效率的檢查（指令會以你當前的目錄來做顯示，）。

如果你想要掃描根目錄硬碟使用狀況，請使用 `ncdu -x /`，若要退出請按 `q` 。

> 此指令並非預設安裝，Ubuntu 環境下的安裝指令為： `apt-get -y install ncdu`

### 搜尋檔案（find）

假使我們想從根目錄開始搜尋「php.ini」在哪裡：

```
sudo find / -name php.ini

```

如果我們不確定檔名，也可以透過「?」來進行模糊搜尋：

```
sudo find / -name ph?.ini

```

### 搜尋歷史指令（Control+R）

有時我們會用到帶有一長串噁心的參數的指令，這些指令只要下過一次後 history 就會記住。

因此我們下次想要再使用它時，只要按下「Control+R」輸入要搜尋的字串，bash 就會顯示最近一項匹配的指令；連續按「Control+R」則繼續搜尋更早的歷史指令，按「Enter」則會執行顯示的指令。

## 檢查網路環境

想要知道網路彼此環境的狀況，除了用最基礎的 `ping` 以外，下面這些指令可以幫你獲得更詳盡的資訊。

### 網路診斷瑞士刀（nc）

Netcat （nc）能夠做到的事情很多，這邊跟大家分享常用的功能。

- **測試目標 Server 特定的 port 是否開啟： `nc -v [host] [port]`**

- **在兩台 Server 間複製檔案**

在接收檔案的 Server 上執行 `nc -l 5000 > demo.js` ，在傳送檔案的 Server 上執行 `nc [host] 5000 < demo.js`

這個操作跟 `scp` 很類似，但特別的地方在於不需要登入的動作（不需要帳號密碼），假使遇到兩台 Server 無法互相登入時， 他就是一個解決方案。

> Netcat 還有非常多的功能，有興趣的可以再自行鑽研。

### 設定好 DNS 後，確認回應是否正常（nslookup）

下面以查詢 google.com 的 ip 為例： `nslookup google.com`

在執行結果中「192.168.220.186」是查詢的 DNS Server，而「172.217.160.110」則是返回的 ip。

> 在內網/外網執行時會有不同回應，可用來確認設定是否符合預期。

### 查詢佔用的 port（lsof）

lsof （List Open Files）可以列出所有被行程打開的檔案，筆者會透過這個指令來看 port 被哪個行程佔用了。

```
lsof -i -P | grep :443

```

`-i` 是查找網路連線， `-P` 是列出實際的 port，最後透過 `grep` 將 port 為 443 的顯示出來。

> 以上是筆者常用的 Linux 指令，如果你平常有用到其他實用的指令，也歡迎留言分享喔！

---

關於作者：林鼎淵（Dean Lin），台灣的生成式 AI 企業內訓講師、外商資安公司軟體專家，也是生成式 AI 創新學院發起人。出版 7 本書（包含全台第一本 ChatGPT 應用專書），兩度獲得 iThome 鐵人賽佳作，累積上百場授課與顧問經驗。（https://deanlin.net/about/）
引用時請附上原文網址：https://deanlin.net/blog/202208/useful-linux-commands/
