記得我第一篇文章就是寫 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 | echo '123' > 123.txt |
最後 123.txt 中的內容會是 ‘546’,不是 ‘123546’。
如果要不希望整個覆寫,而是添加新的內容,可以用「>>
」這個指令,來把內容寫到新的一行。
< <file>
把「檔案」的 input 輸入到左邊的指令中。
1 | # code.txt => 'This is a dog' |
這裡要分清楚 >
跟 <
的用法不太一樣,>
是用來把輸出寫到某個檔案,<
是用來把檔案丟給指令執行。
|
(pipe)組合記。把左邊指令的輸出,變成右邊指令的輸入
假設有個 hello.txt 的內容是這樣:
1 | hello world |
如果我們用「|」來把 cat
跟 grep
做組合,就會變成這樣:
1 | cat hello.txt | grep another |
此時的輸出結果會是「another new line」。
流程是這樣子:
cat
hello.txt 會輸出檔案中的內容|
代表要把 1 的輸出內容當作右邊指令grep another
的輸入內容grep another
因為沒有第三個參數(檔案名稱),所以他會檢查前面是否有輸入的內容(也就是「|」)。- 所以這一整行的意思是「把 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 | echo 'nice to meet you' | sed 's/nice/NICE/g' |
解決重複選取的問題,例如說 This is a book
有兩個 is
,如果沒有做處理的話會變這樣:
1 | echo 'This is a book' | sed 's/is/IS/g' |
如果只想改第二個 is,可以用正規的 <>
來包住單字(記得加上跳脫字元):
1 | echo 'This is a book' | sed 's/\<is\>/IS/g' |
擷取字元
cut -c <n-m> <file>
抓出第 n 個字元到第 m 個字元
1 | echo 1234567890 | cut -c 1-5 |
cut -c <n-m> <file> --complement
排除第 n 個字元到第 m 個字元
1 | echo 1234567890 | cut -c 1-5 --complement |
cut -d <分隔字元> -f <要擷取的欄位> <file>
假設有一個檔案內容是長這樣:
1 | AA,BB,CC,DD,EE,FF |
1 | cut -d , -f 1 code.txt |
流程:
- 第一行會分隔為,欄位一:
AA
,欄位二:BB
,欄位三:CC
… -f
說要擷取的欄位是1
,所以輸出AA
- 換下一行,重複上面動作,直到最後一行。
如果要多個欄位可以寫成 -f <連續欄位>, <單個欄位>
:
1 | cut -d , -f 1-3,6 code.txt |
就是取出每行的 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