iT邦幫忙

2025 iThome 鐵人賽

DAY 17
2

嗨!歡迎回到上班族的命令列生存手冊,前一章節介紹一個危險的東西,大家下之前有沒有特別小心呢?這一章節將會是基礎操作篇的最後一篇,將會來介紹如何串連多個指令。之前在用命令列指令,大部分都是以單一指令為準,比如說:lscatcp … 等。雖然大部分的狀態這樣已經可以完成任務,但是分工合作可以蹦出更多火花,工具能聯合起來用,這就是本章要來介紹的。

Pipe

https://ithelp.ithome.com.tw/upload/images/20251001/201416156Qiyh6oF4a.png

管子。用管子就可以把指令銜接起來,什麼意思阿?比如說,這個指令 grep,用途是從 input 過濾出字串。比如想從目錄之中找檔案,在這個目錄中有 sample 這個檔案嗎?可以這樣下:

$ ls | grep sample

如果有的話就會印出符合條件的行。
另外一個例子是配合 wc 這個指令,wc (word counts) 是用來計算文字數量的指令。配合前面介紹過的 cat 可以拿來計算行數:

https://ithelp.ithome.com.tw/upload/images/20251001/20141615qjS7QSeK6G.png

$ cat Sample.java | wc --lines

pipe 可以把指令不斷的往下接,結合上面學到的 grepwc,可以接上兩個 pipe 來實作:符合條件的有幾個。例如,資料夾下面有四個檔案:hello.txt、xaa、xab 和 xac,上面學到,如果我想知道本目錄下有幾個 xa 開頭的檔案,我只需要下:

$ ls | grep xa

ls 就會印出來符合條件的結果。這個時候可以加上 wc ,計算結果的數量:

$ ls | grep xa | wc --lines

會印出 3 ,直接計算有幾個符合的項目。本範例想說的是只要可行,後面幾乎可以再 pipe 更多的指令,看來只有想像力是 pipe 的上限。

補充

要搜尋文字檔裡頭的內容,不需要先用 cat

$ cat sample.txt | grep "寂寞"

直接用 grep 就行了,關鍵字後面再加上欲搜尋的文字檔案即可。

https://ithelp.ithome.com.tw/upload/images/20251001/20141615GHGQ1M0hJY.png

$ grep "寂寞" sample.txt

上面兩個指令輸出完全是一樣的。

這邊提到的指令

  • grep:依照給他的關鍵字,過濾 input
  • wc:可用來計算文字的數量

xargs

已經到了第 17 篇,讀者也默默的獨自升級了 17 日。應該會發現「欸,pipe 不是每個都有反應?」用上面提到的例子作為範例,例如我想要刪除所有 xa 開頭的檔案:

$ ls | grep xa | rm

這樣下就會沒有反應,怎麼讓他動起來?還記得我們在很久很久以前介紹過,有些參數會從 Standard Input (STDIN,編號是 0),讀取輸入指令嗎?(應該是第二篇) 像是 cat 這類的,wc 也是這種的,輸入指令後不打字,會等待你從鍵盤輸入字給他。

不過,有些命令只可以吃參數,有點像程式的 Method/Function,例如 rm,直接下 rm 就會印出錯誤訊息。
這時就需要 xargs 這個指令,他能把 pipe 過來的東西變成其他指令的參數。

$ ls | grep xa | xargs <接收參數的其他指令>

就範例來說,這樣就可以正常運行:

$ ls | grep xa | xargs rm

ls | grep xa 而來的 input 就會作為 rm 的參數被傳進去。

xargs 可以用 -t 來印出指令做了什麼。

$ ls | grep xa | xargs -t rm

就會印出:rm xaa xab xac

xargs 還可以指定參數的位置,以上面的範例來說,例如我們要重新命名 xa 開頭檔案,全部加上 .txt,還記得重新命名就是 mv 指令嗎?

$ mv xaa xaa.txt

配合 $ ls | grep xa 過濾出 xa 開頭的檔案,接著用 xargs-I 指令。這個指令需要告訴 xargs 一個我們說好的符號,他會把這個符號取代成 input。

$ ls | grep xa | xargs -I <符號> mv <符號> <符號>.txt

<符號> 就會被取代成 mv xaa xaa.bak … 依序印出被濾出的檔案。筆者比較喜歡用 {} 來表示符號。

$ ls | grep xa | xargs -I {} mv {} {}.txt

mv 換成 cp ,就能做出過濾某些檔案,並且執行複製,限制就剩下使用者的想像力。

基礎操作篇,總結

基礎操作篇在熟悉環境篇之上增加了 CRUD 操作 (增加 touch, mkdir、讀取 pipe and grep、更新 touch, cp, mv、刪除 rm ),而且還介紹讀者一個超讚的 Shell — zsh,配合 Framework 使用簡直是蛋糕上的櫻桃,不能再更棒了!並且,介紹串連多個指令(pipe,xargs)來達成更多的事情。
觀念的部份, rm 的章節介紹了 root 名詞的多種詮釋— 一個是地名(根目錄 root directory),一個是人名(超級使用者 root account)。軟連結和硬連結的部份,就像阿妹和阿密特,同一個人不同的名子。

這篇結束之後命令列的操作應該難不倒你了。不過,我們依然有很多東西沒有介紹。下一章節將是進階觀念篇的第一章,筆者又要來介紹一款 Shell,自稱 21 世紀的 Shell,我們下個章節見啦。


上一篇
Day16 基礎操作篇:很有名的那個指令,別亂下 rm
下一篇
Day18 進階觀念篇:你的 Shell 怎麼這麼棒?fish
系列文
上班族的命令列 (CLI) 生存手冊25
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
chiaominchang222
iT邦新手 5 級 ‧ 2025-10-01 19:25:07

還是原來那個我不過流掉幾公升淚所以變瘦~

我要留言

立即登入留言