National Taiwan University
Uedu Main Site
Explore Uedu
Student Console
Register as Member/Login
Research Informed Consent Center
Survey Center
Educational Big Data Challenge
Claim or create a course
Try a Scenario Task
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

2

Local AI

--

Uedu Code

--

台灣大學 AQI 70 24°C PM2.5 17
AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

Unit 10

處理文字檔內容

wc、cat、head、tail 與 less
Interaction 15 minute(s)

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。

互動練習:用 wc 計數、用 cat 合併檔案

每一顆按鈕都是一個真的指令。先用 wc 的各個選項數一數 test.txt,比較位元組數與字元數為什麼不同;再對應投影片的 Lab01 計算 /var/log/dpkg.log 的行數,最後把 a.txt 與 b.txt 合併成 c.txt。

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 只會顯示第一頁;下面的按鍵說明按鈕只顯示文字,請在真的終端機上操作一次。

互動練習:瀏覽 /var/log/dpkg.log

/var/log/dpkg.log 是 dpkg 安裝、移除套件時寫下的紀錄,這裡的檔案有 24 行。依任務對應投影片的 Lab02~Lab04:加上行號列出全部內容、只看前 5 行、從第 5 行開始看,再用管線取出中間幾行,最後用 less 分頁瀏覽。標示「(說明)」的按鈕不會執行指令,只說明在真的終端機上要按哪個鍵。

想一想:wc 與 cat

1.

UTF-8 編碼的 hi.txt 只有一行「你好 Linux」(結尾有換行)。wc -c hi.txt 與 wc -m hi.txt 分別顯示多少?

2.

執行 cat a.txt b.txt > c.txt 之後,c.txt 的內容是?

3.

設定檔讀不進去,你懷疑某一行結尾多了看不見的空白。用哪一個指令最容易看出來?

第 1 次作答

想一想:head、tail 與 less

1.

只想看 dpkg.log 的第 5~8 行,下列哪一個寫法正確?

2.

tail -n +20 /etc/man_db.conf 會顯示什麼?

3.

用 less 開啟一個很長的紀錄檔後,想往下找 error 這個字,找完要離開,應該怎麼按?

第 1 次作答

重點精華回顧

  • 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 離開。
這一課完成了!
Next lesson:I/O 重導與管線
你目前沒有登入,學習進度只存在這個瀏覽器。 Login 後,進度會跟著帳號,換電腦也看得到。