Lệnh wc: đếm số dòng, số từ và cách dùng wc -l với pipe
Lệnh wc là lệnh Linux đếm rồi in ra số dòng, số từ và số byte của một tệp. Khi đếm số dòng của tệp nhật ký truy cập mẫu của máy chủ web bằng wc -l, kết quả là 10, còn khi dùng grep lọc riêng các phản hồi 404 rồi chuyển sang wc -l, bạn có thể thấy số yêu cầu thất bại là 3 dưới dạng một con số duy nhất.
Các nhật ký, nội dung tệp và thư mục làm việc /root/work bên dưới là giá trị ví dụ. Nhật ký là tệp mười dòng được tạo bằng các địa chỉ IP dành cho tài liệu, và các tệp khác cũng đều được tạo để thử nghiệm.
1️⃣ Cách dùng cơ bản lệnh wc và cách đọc kết quả
Dạng cơ bản của lệnh là wc, tiếp theo là tùy chọn, rồi đến tệp. Nếu chỉ đưa tệp mà không có tùy chọn, wc in lần lượt số dòng, số từ, số byte và thêm tên tệp ở cuối.
cd /root/workwc access.log 10 100 766 access.logTrong kết quả đếm nhật ký truy cập, 10 là số dòng, 100 là số từ và 766 là số byte.
Để chỉ xem một con số, hãy thêm một trong các tùy chọn -l, -w hoặc -c.
wc -l access.log10 access.logwc -w access.log100 access.logwc -c access.log766 access.logNếu đưa vào một tệp không tồn tại, thông báo lỗi sẽ hiện ra và mã thoát là 1.
wc nosuch.txtwc: nosuch.txt: No such file or directoryecho $?12️⃣ Đếm dòng bằng wc -l và pipe
Khi tên tệp được in kèm số dòng, bạn phải cắt bỏ tên đó thêm một lần nữa lúc lưu con số vào biến trong script. Nếu chuyển tệp qua chuyển hướng (<) hoặc pipe, wc không biết tên tệp nên chỉ in ra con số.
wc -l < access.log10cat access.log | wc -l10Đặt grep trước pipe thì bạn có thể chỉ đếm những dòng thỏa điều kiện. Việc tìm kiếm có tính cả khoảng trắng trước và sau mã phản hồi 404, và có ba dòng chứa 404.
grep ' 404 ' access.log | wc -l3Để đếm có bao nhiêu IP đã kết nối, hãy cắt riêng cột đầu tiên, xóa các dòng trùng bằng sort -u rồi mới đếm. Trong nhật ký mười dòng có bốn IP khác nhau.
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 đếm số ký tự xuống dòng. Vì vậy, với tệp mà cuối dòng cuối cùng không có ký tự xuống dòng, wc -l in ra 1 dù cat hiển thị hai dòng.
cat no-newline.txtfirst line
last linewc -l no-newline.txt1 no-newline.txtNếu số dòng ra thiếu một, trước hết hãy kiểm tra dòng cuối cùng có kết thúc bằng ký tự xuống dòng hay không.
3️⃣ Tùy chọn của wc và số ký tự với -c, -m
Trong UTF-8, chữ cái tiếng Anh và chữ số chiếm 1 byte mỗi ký tự, còn ký tự tiếng Hàn (Hangul) và ☕ mỗi ký tự chiếm 3 byte. Vì vậy, với tệp chỉ có văn bản tiếng Anh, số byte đếm bằng -c và số ký tự đếm bằng -m bằng nhau, nhưng khi có tiếng Hàn thì hai con số khác nhau. Phép so sánh dùng một tệp có hai dòng tên món bằng tiếng Hàn và một dòng tiếng Anh.
cat menu.txt아메리카노
카페 라테 ☕
teawc -c menu.txt38 menu.txtwc -m menu.txt18 menu.txt-c cho 38 và -m cho 18, chênh nhau 20. Đó là 2 byte dư mà mỗi ký tự trong chín ký tự tiếng Hàn và ☕ chiếm thêm, nên với tệp có tiếng Hàn, hãy đếm bằng -m để khớp với số ký tự thực tế. Phép đo được thực hiện trong locale C.UTF-8, và theo tài liệu hướng dẫn, -m đếm theo đơn vị ký tự của locale.
-L in ra độ rộng hiển thị của dòng dài nhất. Trong nhật ký truy cập, dòng dài nhất rộng 82 cột; trong tệp thực đơn, mỗi ký tự tiếng Hàn và ☕ chiếm hai cột, nên một dòng 7 ký tự cho ra 12.
wc -L access.log82 access.logwc -L menu.txt12 menu.txtChữ Latinh có dấu chiếm 2 byte mỗi ký tự trong UTF-8. Điều này được đo riêng bằng một tệp chỉ có một dòng café.
cat cafe.txtcaféwc -c cafe.txt6 cafe.txtwc -m cafe.txt5 cafe.txt-c cho 6 và -m cho 5, vì một chữ é chiếm thêm 1 byte. Chữ cái tiếng Anh và chữ số chiếm 1 byte, chữ có dấu như é chiếm 2 byte, còn ký tự tiếng Hàn và ☕ chiếm 3 byte, nên dù cùng số ký tự, số byte vẫn khác nhau.
Bảng dưới đây tổng hợp lệnh phù hợp với từng việc và con số đã đếm trong bài viết này.
| Việc cần làm | Lệnh | Đo trong bài viết này |
|---|---|---|
| Chỉ lấy số dòng dưới dạng con số | wc -l < access.log | 10Chỉ con số, không có tên tệp |
| Đếm các dòng thỏa điều kiện | grep ‘ 404 ‘ access.log | wc -l | 3Các dòng có phản hồi 404 |
| Đếm các giá trị khác nhau | cut -d ‘ ‘ -f 1 access.log | sort -u | wc -l | 4Số IP khác nhau |
| Kiểm tra kích thước tệp | wc -c access.log | 766Số byte |
| Số ký tự của tệp có tiếng Hàn | wc -m menu.txt | 1838 khi đếm cùng tệp đó bằng -c |
| Độ rộng hiển thị của dòng dài nhất | wc -L access.log | 8212 với tệp thực đơn, vì mỗi ký tự tiếng Hàn được tính là hai cột |
| Tổng số dòng của nhiều tệp | wc -l *.log | 13Tổng ở dòng total |
4️⃣ Tổng của nhiều tệp với wc trên Linux
Nếu đưa vào nhiều tệp, wc in mỗi tệp một dòng và thêm tổng ở dòng cuối dưới tên total. Khi đếm chung nhật ký truy cập và nhật ký lỗi, số 13 ở dòng total là tổng số dòng của hai tệp.
wc access.log error.log 10 100 766 access.log
3 11 76 error.log
13 111 842 totalĐể đếm một lần các nhật ký có cùng phần mở rộng, hãy dùng ký tự đại diện. Shell đổi *.log thành tên các tệp rồi mới chuyển đi, nên kết quả giống như khi ghi từng tên tệp.
wc -l *.log 10 access.log
3 error.log
13 totalCác tệp có phần mở rộng khác nhau cũng đếm được một lần nếu ghi tên nối tiếp nhau. Hai nhật ký và tệp thực đơn được đếm chung cho kết quả total 16.
wc -l access.log error.log menu.txt 10 access.log
3 error.log
3 menu.txt
16 total🔲 Trình mô phỏng lệnh wc
Trong trình mô phỏng bên dưới, bạn có thể tự gõ wc với các tệp ví dụ trong bài. Các nút chip cho phép thử -l, -m và đếm qua pipe, và nếu thêm một dòng vào access.log rồi đếm lại, con số sẽ tăng lên.
🔢 FAQ & nội dung đề xuất
Linux · Văn bản
Lệnh sort trên Linux: sắp xếp tệp
Các tùy chọn và ví dụ của sort để sắp xếp nội dung tệp theo bảng chữ cái, tăng dần hoặc giảm dần.
Linux · Văn bản
Lệnh uniq trên Linux
Cách dùng uniq để giữ lại một dòng trong các dòng trùng nhau và đếm số lần lặp bằng -c.
Linux · Văn bản
Lệnh head và lệnh tail trên Linux
Tùy chọn và cách dùng head, lệnh in 10 dòng đầu của tệp, và tail, lệnh in 10 dòng cuối.
ℹ️ Thông báo tiếp thị liên kết
Nội dung trên trang này có chứa liên kết affiliate (tiếp thị liên kết). Khi khách truy cập mua sản phẩm hoặc dịch vụ qua các liên kết này, trang sẽ nhận hoa hồng từ bên bán. Trong quá trình đó, số tiền người mua phải trả (sẽ giảm khi có chương trình khuyến mãi ↓) không hề tăng lên. Giá, khuyến mãi và tình trạng hàng được đăng theo thời điểm viết bài và có thể khác với thực tế, vì vậy hãy kiểm tra lại lần cuối với bên bán trước khi mua. Việc chọn và đánh giá sản phẩm dựa trên tiêu chí riêng của trang; việc có nhận hoa hồng hay không không ảnh hưởng đến thứ tự giới thiệu hay nội dung đánh giá.