Learning Objectives
- 用 wc 計算檔案的行數、單字數、位元組數與字元數,分辨 -c 與 -m 遇到中文字時的差別
- 用 cat 顯示與合併檔案,用 -n 加上行號、用 -E 標出每一行的結尾
- 用 head 與 tail 取出前幾行或後幾行,包含 head -n -N 與 tail -n +N 的寫法
- 用 less 分頁瀏覽較長的檔案,知道翻頁、搜尋與離開的按鍵
為什麼要在終端機裡看文字檔
Linux 的設定檔(例如 /etc/hosts)與紀錄檔(例如 /var/log/dpkg.log)幾乎都是純文字檔。
在沒有圖形介面的伺服器上,查看這些檔案只能靠終端機指令;就算有圖形介面,用指令也往往比開編輯器更快。
這一課的四類工具:
| 想做的事 | 指令 | 英文由來 |
|---|---|---|
| 算有幾行、幾個字 | wc |
word count |
| 把整個檔案印出來、合併檔案 | cat |
concatenate(串接) |
| 只看開頭或結尾幾行 | head、tail |
頭、尾 |
| 一頁一頁瀏覽長檔案 | less |
取自「less is more」,是 more 的加強版 |
投影片以 root 執行(提示字元
root@vm:~#)。Ubuntu 預設用一般使用者登入,提示字元結尾是$; 本課的檔案一般使用者就能讀取,不需要sudo。少數紀錄檔(例如/var/log/syslog)只有 adm 群組可以讀, Ubuntu 安裝時建立的第一個帳號預設就在 adm 群組裡。
wc:計算行數、單字數與位元組數
wc [選項] 檔案
| 選項 | 顯示 |
|---|---|
| (不加) | 行數、單字數、位元組數,三個數字依序排列 |
-l |
行數(line),實際上是計算換行字元的個數 |
-w |
單字數(word),以空白或換行隔開的一段文字算一個單字 |
-c |
位元組數(byte) |
-m |
字元數(character) |
-L |
最長那一行的長度(以畫面上的欄位寬度計算) |
以投影片的 test.txt 為例,內容有 7 行:
壹
貳 參
a
bb
ccc
dddd
e e e e e
$ wc test.txt
7 12 36 test.txt
$ wc -m test.txt
30 test.txt
數字前面的空白只是對齊用的。位元組數 36 和字元數 30 不一樣,原因是 Ubuntu 預設使用 UTF-8 編碼:
英文字母、數字、空白與換行各佔 1 個位元組,常見的中文字各佔 3 個位元組。檔案裡有 3 個中文字,
所以位元組數比字元數多 3 × 2 = 6。處理中文文字時,要算「幾個字」請用 -m,-c 算的是檔案佔多少空間。
wc 也可以接在管線後面,計算前一個指令的輸出(管線 | 在下一課詳細說明):
$ echo 貳 參 | wc -c
8
$ echo 貳 參 | wc -m
4
echo 會在最後加上換行,所以「貳 參」是 2 個中文字+1 個空白+1 個換行:位元組數 3+1+3+1=8,字元數 4。
cat:顯示與合併檔案
cat [選項] 檔案 [檔案…]
cat 會把檔案內容原封不動送到畫面上;後面接多個檔案時,依序一個接一個印出,這就是名稱「串接」的由來。
| 選項 | 作用 |
|---|---|
-n |
每一行前面加上行號(空白行也編號) |
-b |
加上行號,但空白行不編號 |
-E |
在每一行的結尾顯示 $,看得出行尾有沒有多餘的空白 |
-T |
把 Tab 顯示成 ^I |
-A |
等於 -vET:把看不見的特殊字元全部標示出來 |
-s |
連續的多個空白行壓縮成一行 |
投影片的例子:
$ cat a.txt b.txt
aa
bbb
$ cat a.txt b.txt > c.txt
$ cat -E c.txt
aa$
bbb$
$ cat -n c.txt
1 aa
2 bbb
> c.txt 是「把輸出存進 c.txt,不要印在畫面上」,屬於下一課的「輸出重導」。
cat適合看短檔案。檔案有幾百行時,內容會一口氣捲過畫面,只剩最後一段看得到;這時改用head、tail或less。
head 與 tail:只看開頭或結尾
head 取出檔案的前幾行,tail 取出最後幾行;不指定行數時都是 10 行。
| 寫法 | 結果 |
|---|---|
head 檔案 |
前 10 行 |
head -n 15 檔案 |
前 15 行 |
head -n -20 檔案 |
除了最後 20 行以外的全部(負數=從結尾扣掉幾行) |
tail 檔案 |
最後 10 行 |
tail -n 15 檔案 |
最後 15 行 |
tail -n +20 檔案 |
從第 20 行開始,一直到最後(加號=從第幾行開始) |
tail -f 檔案 |
印出最後幾行後不結束,檔案有新內容就繼續顯示;按 Ctrl+C 結束 |
-n 5 也可以簡寫成 -5,例如 tail -5 檔案。
tail -f 很適合一邊操作、一邊看紀錄檔的變化,例如在另一個終端機視窗執行 tail -f /var/log/dpkg.log,
再安裝套件,就會看到新的紀錄一行一行出現。
要取出「中間」的某幾行,可以把兩個指令用管線接起來。例如第 5~8 行:
head -n 8 /var/log/dpkg.log | tail -n 4
先用 head 留下前 8 行,再從這 8 行裡取最後 4 行,剩下的就是第 5~8 行。
less:一頁一頁瀏覽
less 檔案
less 會把檔案顯示成一頁,畫面最下方出現 : 等你按鍵;看到 (END) 表示已經到檔案結尾。
less 只讀取檔案、不會修改內容,man 顯示說明文件時用的也是它,所以這些按鍵在 man 裡一樣能用。
| 按鍵 | 作用 |
|---|---|
空白鍵、PageDown、Ctrl+F |
下一頁 |
b、PageUp、Ctrl+B |
上一頁 |
Ctrl+D/Ctrl+U |
往下/往上半頁 |
j、↓/k、↑ |
往下/往上一行 |
/字串 |
往下搜尋「字串」,按 Enter 開始 |
?字串 |
往上搜尋「字串」 |
n/N |
重複上一次搜尋/反方向重複上一次搜尋 |
g/G |
跳到第一行/最後一行 |
q |
離開 |
一次開啟多個檔案(less a.txt b.txt)時,輸入 :n 切換到下一個檔案、:p 回到上一個。
練習用的模擬器不能按鍵盤,
less只會顯示第一頁;下面的按鍵說明按鈕只顯示文字,請在真的終端機上操作一次。
想一想:wc 與 cat
UTF-8 編碼的 hi.txt 只有一行「你好 Linux」(結尾有換行)。wc -c hi.txt 與 wc -m hi.txt 分別顯示多少?
執行 cat a.txt b.txt > c.txt 之後,c.txt 的內容是?
設定檔讀不進去,你懷疑某一行結尾多了看不見的空白。用哪一個指令最容易看出來?
想一想:head、tail 與 less
只想看 dpkg.log 的第 5~8 行,下列哪一個寫法正確?
tail -n +20 /etc/man_db.conf 會顯示什麼?
用 less 開啟一個很長的紀錄檔後,想往下找 error 這個字,找完要離開,應該怎麼按?
重點精華回顧
wc預設顯示行數、單字數、位元組數;-l行數、-w單字數、-c位元組數、-m字元數、-L最長一行的長度。- UTF-8 裡常見的中文字一個佔 3 個位元組,所以中文檔案的
wc -c會比wc -m大;要算幾個字用-m。 cat依序印出檔案內容,也能用cat a b > c合併檔案;-n加行號、-E在行尾顯示$。head、tail預設 10 行;head -n -N去掉最後 N 行,tail -n +N從第 N 行開始,tail -f持續追蹤新內容。- 用
head與tail串成管線,可以取出中間的某幾行。 less分頁瀏覽:空白鍵下一頁、b上一頁、/字串搜尋、n下一個、g/G跳到開頭/結尾、q離開。