Commandline 的指令

記得我第一篇文章就是寫 Command-line 怎麼用,還真懷念。但人會隨著時間慢慢成長,所以這次要來把 Command-line 的指令紀錄的更加完整。

簡單介紹 GUI 與 CLI 是什麼

圖形化介面 GUI(Graphic User Interface),我們日常在桌面上看的到的那些畫面,像是資料夾,我的電腦等等。
你可以透過那個介面來操作的東西就是「GUI」。

但在早期沒有圖形化介面,所以都用「Command Line Interface」來跟電腦做溝通。而 CLI 是透過「純文字」來操作電腦的方法。再次強調,你只會用文字來溝通。

CLI 的指令

提醒:這邊的指令建議都用 Git bash 來實作比較不會出錯

補充觀念:指令是可以下載的,畢竟指令其實就是執行一段程式

pwd(Print Working Directory) 印出所在位置

touch <file> 碰一下。更改檔案的最後修改時間。如果檔案不存在的話,建立一個新的檔案。

man(Manual) 查看使用說明

mkdir <directory>(Make Directory) 建立新的資料夾

rmdir <directory>(Remove directiory) 刪除資料夾

cat <file1> <file2>(Concatenation) 用來連接檔案。但如果你只有寫一個檔案(一個參數),會直接顯示出檔案內容。

wget <url> 下載檔案。(要額外安裝的指令)可以用來下載檔案,包含圖片、原始碼等等。

ls(List) 印出目前資料夾底下的檔案

  • ls -l 印出更詳細的內容
  • ls -a 不忽略「.」開頭的檔案

cd <directory>(Change Directory) 切換到指定的資料夾

  • cd .. 回到上一層資料夾
  • cd ~ 回到 user/userName 的位置(應該是根目錄吧)

rm <file> (Remove)刪除檔案

  • rm -f <directory>(force) 強制刪除檔案
  • rm -r <directory> rm -R <directory>(root) / 資料夾跟底下的東西全部刪除
  • rm -fr <directory> 強制刪除根目錄跟所有檔案(如果只用 rm -f 的話,.git 檔會被留下)

mv <file>(Move)移動檔案或是改名

  • mv 檔案 要移動到的資料夾
  • mv 檔案 ..(移到上一層資料夾)
  • mv 檔案 要更改的新名稱

絕對位置與相對位置的概念

絕對位置是以 / 作為開頭的路徑(代表 /user/userName)
相對位置是以目前的檔案位置作為參考。

例如說 test 資料夾中有另一個 another 資料夾。假設我們在 test 資料夾,那就可以下 cd another 這個指令來移動到 another 資料夾。

cp <file>(Copy)複製檔案

  • cp 原本的檔案 複製的新檔案名稱
  • cp -f 如果是資料夾的話,可以用 -f 參數來強制執行。

vim [<file>] 一個文字編輯器。可以透過 vi 或 vim 指令進入:

  • i(Insert) 進入插入(編輯)模式
  • esc(Escape) 進入普通模式(可以複製、貼上,但就是不能打字)
  • p 貼上
  • dd / D 刪除一行內容
  • :%d 刪除所有內容
  • :q 退出(quit)
  • :qa! 不保存檔案退出
  • :wq 存檔並退出(write and quit)

grep <regexp> <file> 抓出關鍵字。輸入你想要的關鍵字(正則表達式) + 檔案名稱。就會把包含那個關鍵字的那一「整行」的文字印出來。

  • grep -E <regexp> <file> 搜尋多個關鍵字,例如 “字串 1|字串 2|字串 3”
  • grep -o <regexp> <file> 只印出關鍵字的部分,而不是整行印出

curl <url> 送出 request。

  • curl -I 只顯示 HTTP 的相關 header(不顯示 body)
  • curl -i 顯示 HTTP 的相關 header (因為預設只顯示 body,所以要把 header 給 include)
  • curl -X 指定要用 HTTP 的哪個方法來溝通(GET、POST、DELETE 等等)
  • curl -d -F option 的項目,代表要用 POST 傳遞的資料(兩種 content-type)
  • curl --silent 只顯示回傳的內容(不顯示讀取的進度資料)

試試看:

1
curl https://jsonplaceholder.typicode.com/todos/1

你就能得到 API 的回傳結果(這招真方便!)

> <file> (redirection)把「指令」的輸出結果重新導向到「檔案」。

原本的輸出會直接顯示在 terminal 上,但如果用 > 的話,就會把輸出結果重新導向到「你指向的檔案」。

1
echo '123' > 123.txt

另外,重新導向的內容會覆寫掉原本的內容

1
2
echo '123' > 123.txt
echo '546' > 123.txt

最後 123.txt 中的內容會是 ‘546’,不是 ‘123546’。

如果要不希望整個覆寫,而是添加新的內容,可以用「>>」這個指令,來把內容寫到新的一行。

< <file> 把「檔案」的 input 輸入到左邊的指令中。

1
2
3
# code.txt => 'This is a dog'
cat < code.txt
This is a dog

這裡要分清楚 >< 的用法不太一樣,> 是用來把輸出寫到某個檔案,< 是用來把檔案丟給指令執行。

|(pipe)組合記。把左邊指令的輸出,變成右邊指令的輸入

假設有個 hello.txt 的內容是這樣:

1
2
3
hello world
a new line
another new line

如果我們用「|」來把 catgrep 做組合,就會變成這樣:

1
cat hello.txt | grep another

此時的輸出結果會是「another new line」。

流程是這樣子:

  1. cat hello.txt 會輸出檔案中的內容
  2. | 代表要把 1 的輸出內容當作右邊指令 grep another 的輸入內容
  3. grep another 因為沒有第三個參數(檔案名稱),所以他會檢查前面是否有輸入的內容(也就是「|」)。
  4. 所以這一整行的意思是「把 cat hello.txt」的輸出結果當作「grep another」的輸入內容

除此之外,你也可以用其他指令來做出更多的組合記。例如說現在想要把 cat hello.text | grep another 的輸出結果寫到一個新的檔案中:

1
cat hello.txt | grep another > result

此時如果你再使用 cat result 來查看檔案內容,就會得到「another new line」。

進階指令

取代字串

  • sed '/s<regExp>/<replace-text>/g' ,有點難閱讀的話就想成這樣 s/<A>/<B>/,AB 代表參數。

另外補充一下,sed 只會改輸出不會改原內容。

1
2
echo 'nice to meet you' | sed 's/nice/NICE/g' 
NICE to meet you

解決重複選取的問題,例如說 This is a book 有兩個 is,如果沒有做處理的話會變這樣:

1
2
echo 'This is a book' | sed 's/is/IS/g'
ThIS IS a book

如果只想改第二個 is,可以用正規的 <> 來包住單字(記得加上跳脫字元):

1
2
echo 'This is a book' | sed 's/\<is\>/IS/g' 
This IS a book

擷取字元

cut -c <n-m> <file> 抓出第 n 個字元到第 m 個字元

1
2
echo 1234567890 | cut -c 1-5
12345

cut -c <n-m> <file> --complement 排除第 n 個字元到第 m 個字元

1
2
echo 1234567890 | cut -c 1-5 --complement
67890

cut -d <分隔字元> -f <要擷取的欄位> <file>

假設有一個檔案內容是長這樣:

1
2
3
AA,BB,CC,DD,EE,FF
GG,HH,II,JJ,KK,LL
MM,NN,OO,PP,QQ,RR
1
2
3
4
cut -d , -f 1 code.txt
AA
GG
MM

流程:

  1. 第一行會分隔為,欄位一:AA,欄位二:BB,欄位三:CC
  2. -f 說要擷取的欄位是 1,所以輸出 AA
  3. 換下一行,重複上面動作,直到最後一行。

如果要多個欄位可以寫成 -f <連續欄位>, <單個欄位>

1
2
3
4
cut -d , -f 1-3,6 code.txt
AA,BB,CC,FF
GG,HH,II,LL
MM,NN,OO,RR

就是取出每行的 1-3 欄跟 6 欄。

其他指令

  • whoami 我是誰,會顯示目前電腦的使用者名稱
  • less <file-name> 用分頁來查看檔案內容,可以用 ↑ ↓ 來 往上或往下滾;← → 來切換頁面,q 是退出,h 是看幫助。
  • explorer 開啟檔案總管
  • history 檢視所有指令紀錄
  • ipconfig 查詢主機的 IP 設定與地址
  • ping <ip-address> 連到某個主機(或域名),看看某個主機是開著還是關著的
  • uname Unix Name 的縮寫,列出主機的作業系統名稱
  • hostname 查看主機名稱
  • netstat 查詢網路目前的狀況
  • nslookup [<domain-name>] [id-address] 用 domain name 來查 IP 地址,也可反過來
  • telnet 連到指定的連接埠(port)
  • date 顯示時間
  • tree 查看資料結構的樹狀圖,要顯示檔案可加上 /f
  • base64 把左邊的 input 或右邊的 output 用 base64 來編碼(搭配 |< 使用),要解碼可以加上 -d
  • tasklist 類似工作管理員,可以查看目前執行的程式
  • taskkill 關掉程式。//im 指定檔案名稱,//PID 指定 ID

想學更多可以參考的文章

參考資料

linux 用 grep 查詢單個或多個字串(關鍵字)
用 grep 搭配正規表示式擷取字串
Redirecting Input and Output

VS-Code 一些實用的快捷鍵 mentor-program-day03
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×