wc 指令:計算行數、字數與 wc -l 管線用法
wc 指令是計算並輸出檔案行數、字數與位元組數的 Linux 指令。用 wc -l 計算網頁伺服器存取記錄範例檔的行數會得到 10;用 grep 只篩出 404 回應再交給 wc -l,就能以一個數字看到失敗的請求數 3。
以下的記錄、檔案內容與工作資料夾 /root/work 都是範例值。記錄檔是用文件專用 IP 位址做成的十行檔案,其他檔案也全都是為了測試而建立的。
1️⃣ wc 指令的基本用法與輸出解讀
指令的基本格式依序是 wc、選項、檔案。不加選項只給檔案時,會依序輸出行數、字數、位元組數,並在最後加上檔案名稱。
cd /root/workwc access.log 10 100 766 access.log在計算存取記錄的結果中,10 是行數,100 是字數,766 是位元組數。
只想看一個數字時,加上 -l、-w、-c 其中一個即可。
wc -l access.log10 access.logwc -w access.log100 access.logwc -c access.log766 access.log給了不存在的檔案時,會出現錯誤訊息,結束代碼為 1。
wc nosuch.txtwc: nosuch.txt: No such file or directoryecho $?12️⃣ 用 wc -l 計算行數與管線
計算行數時如果連檔案名稱一起輸出,把數字存進指令稿變數時就得再把名稱切掉一次。用重新導向(<)或管線傳入檔案時,wc 不知道檔案名稱,所以只輸出數字。
wc -l < access.log10cat access.log | wc -l10在管線前面放 grep,就能只計算符合條件的行。搜尋時連回應碼 404 前後的空格也一起放進去,含有 404 的行有三行。
grep ' 404 ' access.log | wc -l3要計算有幾個不同的 IP 連線時,先只切出第一欄,用 sort -u 刪掉重複的行後再計算。在十行的記錄中,不同的 IP 有四個。
cut -d ' ' -f 1 access.log | sort -u192.0.2.10
192.0.2.44
198.51.100.7
203.0.113.25cut -d ' ' -f 1 access.log | sort -u | wc -l4wc -l 計算的是換行字元的數量。因此最後一行結尾沒有換行的檔案,即使 cat 顯示兩行,wc -l 也只輸出 1。
cat no-newline.txtfirst line
last linewc -l no-newline.txt1 no-newline.txt行數少了一行時,先確認最後一行結尾有沒有換行。
3️⃣ wc 選項整理與 -c、-m 字元數
在 UTF-8 中,英文字母與數字每個字元占 1 個位元組,韓文與 ☕ 每個字元占 3 個位元組。所以只有英文的檔案,用 -c 算出的位元組數和用 -m 算出的字元數相同;加入韓文後,兩個數字就會不同。比較用的是含兩行韓文菜單名稱與一行英文的檔案。
cat menu.txt아메리카노
카페 라테 ☕
teawc -c menu.txt38 menu.txtwc -m menu.txt18 menu.txt-c 是 38,-m 是 18,相差 20。這是九個韓文字與 ☕ 每個字元各多占 2 個位元組的部分,因此含韓文的檔案要用 -m 計算,才會和實際字元數相符。測量是在 C.UTF-8 語系下進行,依手冊說明,-m 以語系的字元單位計算。
-L 輸出最長一行的顯示寬度。存取記錄中最長的一行是 82 欄;菜單檔案中韓文與 ☕ 每個字元占兩欄,所以 7 個字元的那一行得到 12。
wc -L access.log82 access.logwc -L menu.txt12 menu.txt帶重音符號的拉丁字母在 UTF-8 中每個字元占 2 個位元組。這是用只有一行 café 的檔案另外測量的。
cat cafe.txtcaféwc -c cafe.txt6 cafe.txtwc -m cafe.txt5 cafe.txt-c 是 6,-m 是 5,一個 é 多占了 1 個位元組。英文字母與數字占 1 個位元組,像 é 這樣的重音字母占 2 個位元組,韓文與 ☕ 占 3 個位元組,所以即使字元數相同,位元組數也會不同。
下表整理了各項工作適合的指令,以及本文實際算出的數字。
| 要做的事 | 指令 | 本文實測 |
|---|---|---|
| 只取得行數數字 | wc -l < access.log | 10只要數字,不含檔案名稱 |
| 計算符合條件的行 | grep ‘ 404 ‘ access.log | wc -l | 3404 回應的行 |
| 計算不重複的值 | cut -d ‘ ‘ -f 1 access.log | sort -u | wc -l | 4不同 IP 的數量 |
| 確認檔案大小 | wc -c access.log | 766位元組數 |
| 含韓文檔案的字元數 | wc -m menu.txt | 18同一個檔案用 -c 計算是 38 |
| 最長一行的顯示寬度 | wc -L access.log | 82菜單檔案把一個韓文字算成兩欄,得到 12 |
| 多個檔案的行數總和 | wc -l *.log | 13total 行顯示總和 |
4️⃣ 用 Linux wc 計算多個檔案的總和
給多個檔案時,會每個檔案各輸出一行,並在最後一行以 total 加上總和。把存取記錄和錯誤記錄一起計算時,total 行的 13 就是兩個檔案行數的總和。
wc access.log error.log 10 100 766 access.log
3 11 76 error.log
13 111 842 total一次計算相同副檔名的記錄時,使用萬用字元。Shell 會把 *.log 換成檔案名稱再傳入,所以結果和逐一寫出檔案名稱相同。
wc -l *.log 10 access.log
3 error.log
13 total副檔名不同的檔案,只要把名稱接著寫,也能一次計算。兩個記錄檔加上菜單檔案一起計算的結果是 total 16。
wc -l access.log error.log menu.txt 10 access.log
3 error.log
3 menu.txt
16 total🔲 wc 指令模擬器
在下方的模擬器中,可以用本文的範例檔案直接輸入 wc。用晶片按鈕可以試試 -l、-m 與管線計算,在 access.log 加一行後再算一次,就會看到增加後的數字。
🔢 FAQ & 推薦內容
ℹ️ 聯盟行銷說明
本站內容包含聯盟行銷連結。訪客透過這些連結購買商品或服務時,本站會從賣家獲得佣金。在這個過程中,購買者支付的金額(遇到活動折扣時金額會降低↓)並不會因此提高。刊登的價格、折扣與庫存資訊以撰寫當時為準,可能與實際情況不同,購買前請向賣家做最後確認。商品的挑選與評價依本站自訂的標準撰寫,是否支付佣金不會影響介紹順序或評價內容。