前言
cmd 可以讓我們透過輸入指令的方式來操作電腦,比起圖形化介面的好處在於我們擁有更多對電腦的操縱權,不過缺點也是必須要查閱或者熟記這些指令。
底下會介紹三個常用的 shell 指令,如果想要知道更多更 fancy 的 shell 指令,可以參考鳥哥的私房菜-學習 Shell Scripts。
常用的 shell 指令們
cut
cut 可以逐行
擷取字串,來看看它的用法。
- 擷取連續字串
如果想要得到資料夾底下的檔案的權限,可以擷取每一列的第 2 到第 10 個字。
ls -l | cut -c 2-10
- 擷取不連續字串
擷取不連續字串時用逗點分開。
ls -l | cut -c 2-3,5-6,8-9
- 排除字串
如果想擷取大部分的字串,可以設定不要的字串就好(一樣適用連續與不連續)。
ls -l | cut -c 2-10 --complement
- 輸出分隔的字串
如果輸入是逗點分隔檔(.csv),可以設定分隔符號,再搭配前面的用法逐行擷取不同的欄位(一樣適用連續與不連續)。
cut -d , -f 2 test.csv
sed
sed 簡介
sed 是「stream editor」的縮寫,進行串流 (stream) 的編輯,以我的理解,處理串流資料的意義在於處理完資料以後不會將原始資料儲存的概念,以節省空間以及加快速度。
sed 的用法大概如下 sed [options] [scripts] [inputFile]
,這邊用 Talor Swift 的 Red 的部分歌詞做示範,將部分的歌詞存進 red.txt 裡,內容如下:
Loving him is like
Driving a new Maserati down a dead end street
Loving him is like
Trying to change your mind once you're already flying through the free fall
Losing him was blue like I'd never known
Missing him was dark grey, all alone
Forgetting him was like trying to know somebody You never met
But loving him was red
Loving him was red
常用的 options
- -n (沉默模式)
注意在沉默模式下,不會打印出結果。
sed -n 's/him/her/1' red.txt
- -e(編輯模式)
注意編輯模式只會打印結果,不會修改原始檔案,並且如果沒有輸入 option,-e 是預設的。
sed -e 's/him/her/1' red.txt
- -f(讀取檔案腳本)
注意這個模式會讀取存放在檔案中的 sed 程式腳本然後打印出來。
現在假設寫一個腳本 sed_command.txt,內容是
s/him/her/
s/was/is/
接著在終端機輸入:
sed -f sed_command.txt red.txt
- -i(修改模式)
注意 cat 出來的 red.txt 檔案裡每一行的第一個的 him
已經被取代成 her
了,原始檔案被改變了。
註: 之後的範例還是維持原始的 red.txt 檔,也就是說做了一次 sed -i 's/her/him/1' red.txt
讓檔案恢復原狀。
sed -i 's/him/her/1' red.txt
cat red.txt
常用的 script
- a(append)
在第一行後面
加上 an apple
。
sed '1a an apple' red.txt
- i(insert)
在第一到第三行的前面
都插入 an apple
。
sed '1,3i an apple' red.txt
- c(change)
將第二行改成 Living in the heaven
。
sed '2c Living in the heaven' red.txt
- d(delete)
刪除第一到第五行(刪除第一段)。
sed 1,5d red.txt
- s(substitute)
沿用介紹 -e
時所用的例子,這邊將每一行的第一個 him
給取代成 her
,取代的語法可以寫成通式 s/regexp/replacement/[flags],在這個例子裡 flags 是 1,代表每一行的第一個,下面會補充常用的 flags。
sed 's/him/her/1' red.txt
如果只想改動第一行:
sed '1 s/him/her/1' red.txt
常用的 flags
- [0-9]:只搜尋或者取代第 N 個字串
- g:全部取代
- I:忽略大小寫
- w:只顯示符合的結果(行),如果和其他 flags 使用要放在最後面。
exit
exit
可以將終端機給關閉。