![Cách sử dụng lệnh wc trong Linux Cách sử dụng lệnh wc trong Linux](https://www.howtogeek.com/wp-content/uploads/2022/03/shutterstock_321627716.png?width=1198&trim=1,1&bg-color=000&pad=1,1)
Đếm số dòng, từ và byte trong một tệp là hữu ích, nhưng tính linh hoạt thực sự của Linux wc
lệnh đến từ việc làm việc với các lệnh khác. Chúng ta hãy xem xét.
Lệnh wc là gì?
Các wc
lệnh là một ứng dụng nhỏ. Đây là một trong những tiện ích cốt lõi của Linux, vì vậy không cần phải cài đặt nó. Nó sẽ có trên máy tính Linux của bạn.
Bạn có thể mô tả những gì nó làm trong một vài từ. Nó đếm các dòng, từ và byte trong một tệp hoặc lựa chọn tệp và in kết quả trong cửa sổ đầu cuối. Nó cũng có thể lấy đầu vào từ luồng STDIN, nghĩa là văn bản bạn muốn nó xử lý có thể được đưa vào đó. Đây là đâu wc
thực sự bắt đầu gia tăng giá trị.
Đó là một ví dụ tuyệt vời về câu thần chú của Linux về “làm một việc và làm tốt”. Bởi vì nó chấp nhận đầu vào theo đường ống, nó có thể được sử dụng trong các câu thần chú đa lệnh. Như chúng ta sẽ thấy, tiện ích độc lập nhỏ này thực sự là một người chơi đồng đội tuyệt vời.
Một cách tôi sử dụng wc
là trình giữ chỗ trong một lệnh phức tạp hoặc bí danh mà tôi đang chuẩn bị. Nếu lệnh hoàn thành có khả năng phá hủy và xóa tệp, tôi thường sử dụng wc
như một chỗ đứng cho lệnh thực sự nguy hiểm.
Bằng cách đó, trong quá trình phát triển lệnh, tôi nhận được phản hồi trực quan rằng mỗi tệp đang được xử lý như tôi mong đợi. Không có khả năng xảy ra bất cứ điều gì xấu trong khi tôi đang vật lộn với cú pháp.
Đơn giản như wc
là, vẫn còn một số điều kỳ quặc nhỏ mà bạn cần biết.
Bắt đầu với wc
Cách đơn giản nhất để sử dụng wc
là chuyển tên của một tệp văn bản trên dòng lệnh.
wc lorem.txt
Điều này gây ra wc
để quét tệp và đếm các dòng, từ, byte và ghi chúng ra cửa sổ dòng lệnh.
Các từ được coi là bất cứ thứ gì bị giới hạn bởi khoảng trắng. Cho dù chúng có phải là các từ từ một ngôn ngữ thực hay không là không liên quan. Nếu một tệp không chứa gì ngoài “frd g lkj”, nó vẫn được tính là ba từ.
Dòng là chuỗi các ký tự được kết thúc bằng ký tự xuống dòng hoặc cuối tệp. Không quan trọng nếu dòng bao quanh trong trình chỉnh sửa của bạn hoặc trong cửa sổ đầu cuối, cho đến khi wc
gặp dấu xuống dòng hoặc cuối tệp, nó vẫn ở cùng một dòng.
Ví dụ đầu tiên của chúng tôi tìm thấy một dòng trong toàn bộ tệp. Đây là nội dung của tệp “lorem.txt”.
cat lorem.txt
Tất cả những thứ đó được tính là một dòng vì không có ký tự xuống dòng nào. So sánh tệp này với tệp khác, “lorem2.txt” và cách wc
diễn giải nó.
wc lorem2.txt
cat lorem2.txt
Thời gian này, wc
đếm 15 dòng vì ký tự xuống dòng đã được chèn vào văn bản để bắt đầu một dòng mới tại các điểm cụ thể. Tuy nhiên, nếu bạn đếm các dòng có văn bản trong đó, bạn sẽ thấy chỉ có 12 dòng.
Ba dòng còn lại là dòng trống ở cuối tệp. Chúng chỉ chứa các ký tự xuống dòng. Mặc dù không có văn bản nào trong những dòng này, một dòng mới đã được bắt đầu và như vậy wc
đếm chúng như vậy.
Chúng tôi có thể chuyển bao nhiêu tệp đến wc
như chúng tôi muốn.
wc lorem.txt lorem2.txt
Chúng tôi nhận thống kê cho từng tệp riêng lẻ và tổng số cho tất cả các tệp.
Chúng tôi cũng có thể sử dụng các ký tự đại diện để có thể chọn các tệp phù hợp thay vì các tệp được đặt tên rõ ràng.
wc *.txt *.?
Các tùy chọn dòng lệnh
Theo mặc định, wc
sẽ hiển thị các dòng, từ và byte trong mỗi tệp. Nó cũng giống như việc sử dụng -l
(dòng) -w
(lời nói) và -c
(byte) tùy chọn.
wc lorem.txt
wc -l -w -c lorem.txt
Chúng tôi có thể chỉ định sự kết hợp của các số liệu mà chúng tôi muốn xem.
wc -l lorem.txt wc -w lorem.txt wc -c lorem.txt wc -l -c lorem.txt
Cần chú ý đặc biệt đến con số cuối cùng, được tạo ra bởi -c
(byte) tùy chọn. Nhiều người nhầm đây là đếm các ký tự. Nó thực sự tính byte. Số ký tự và số byte cũng có thể giống nhau. Nhưng không phải lúc nào cũng vậy.
Hãy xem nội dung của một tệp có tên “unicode.txt”.
cat unicode.txt
Nó có ba từ và một ký tự không thuộc bảng chữ cái Latinh. Tốt để cho wc
xử lý tệp với cài đặt mặc định của nó là bytevà chúng tôi sẽ làm lại nhưng yêu cầu nhân vật với -m
(ký tự) tùy chọn.
wc unicode.txt
wc -l -w -m unicode.txt
Có nhiều byte hơn số ký tự.
Hãy xem kết xuất hex của tệp và xem điều gì đang xảy ra. Các hexdump
lệnh của -C
(canonical) tùy chọn hiển thị các byte trong tệp trong các dòng 16, với ASCII đơn giản tương đương của chúng (nếu có) được hiển thị ở cuối dòng. Nếu không có ký tự ASCII tương ứng, dấu chấm “.
”Được hiển thị thay thế.
hexdump -C unicode.txt
Trong ASCII, giá trị thập lục phân của 0x20
đại diện cho một ký tự khoảng trắng. Nếu chúng ta đếm ba giá trị từ bên trái, chúng ta thấy giá trị tiếp theo là một ký tự khoảng trắng. Vì vậy, ba giá trị đầu tiên đó 0x62
, 0x6f
và 0x79
đại diện cho các chữ cái trong “cậu bé”.
Nhảy qua 0x20
chúng tôi thấy một bộ ba giá trị thập lục phân khác: 0x63
, 0x61
và 0x74
. Chúng đánh vần là “mèo.” Nhảy qua ký tự khoảng trắng tiếp theo, chúng ta thấy thêm ba giá trị nữa cho các chữ cái trong “dog”. đó là 0x64
, 0x5f
và 0x67
.
Ngay sau từ “dog”, chúng ta có thể thấy một ký tự khoảng trắng 0x20
và năm giá trị thập lục phân khác. Hai cách cuối cùng là ký tự xuống dòng, 0x0a
.
Ba byte còn lại đại diện cho ký tự không phải Latinh, mà chúng tôi đã đánh dấu màu xanh lục. Nó là một ký tự Unicode và cần ba byte để mã hóa nó. đó là 0xe1
, 0xaf
và 0x8a
.
Vì vậy, hãy đảm bảo rằng bạn biết mình đang đếm những gì và byte và ký tự không cần giống nhau. Thông thường, việc đếm byte hữu ích hơn vì nó cho bạn biết điều gì thực sự là nội bộ tập tin. Đếm theo ký tự cung cấp cho bạn số thứ đại diện bởi nội dung của tệp.
Lấy tên tệp từ tệp
Có một cách khác để cung cấp tên tệp cho wc
. Bạn có thể đặt tên tệp vào một tệp và chuyển tên của cái đó nộp cho wc
. Nó mở tệp, trích xuất tên tệp và xử lý chúng như thể chúng đã được chuyển qua dòng lệnh. Điều này cho phép bạn lưu trữ một bộ sưu tập tên tệp tùy ý để sử dụng lại.
Nhưng có một gotcha, và nó là một thứ lớn. Tên tệp phải là vô giá trị chấm dứt, không phải vận chuyển trở lại chấm dứt. Nghĩa là, sau mỗi tên tệp phải có một byte rỗng của 0x00
thay vì byte trả về dòng thông thường 0x0a
.
Bạn không thể mở trình chỉnh sửa và tạo tệp có định dạng này. Thông thường, các tệp như thế này được tạo bởi các chương trình khác. Nhưng, nếu bạn có một tệp như vậy, đây là cách bạn sẽ sử dụng nó.
Đây là tệp của chúng tôi chứa các tên tệp. Mở nó trong less
cho bạn thấy điều kỳ lạ “^@
”Ký tự less
sử dụng để chỉ byte rỗng.
less source-files-list.txt
Để sử dụng tệp với wc
chúng ta cần sử dụng --files0-from
(đọc đầu vào từ) và chuyển vào tên của tệp có chứa tên tệp.
wc ---files0-from=source-files-list.txt
Các tệp được xử lý chính xác như thể chúng được cung cấp trên dòng lệnh.
Piping Input to wc
Một cách phổ biến, linh hoạt và hiệu quả hơn nhiều để gửi thông tin đầu vào wc
là chuyển đầu ra từ các lệnh khác vào wc
. Chúng tôi có thể chứng minh điều này với echo
yêu cầu.
echo "Count this for me" | wc
echo -e "Count thisnfor me" | wc
Thư hai echo
lệnh sử dụng -e
(các ký tự thoát) để cho phép các chuỗi thoát như “n
”Mã định dạng dòng mới. Điều này tạo ra một dòng mới, gây ra wc
để xem đầu vào là hai dòng.
Đây là một loạt các lệnh cung cấp đầu vào của chúng từ cái này sang cái khác.
find ./* -type f | rev | cut -d'.' -f1 | rev | sort | uniq
-
tìm thấy tìm kiếm các tệp (
type -f
) đệ quy, bắt đầu trong thư mục hiện tại.rev
đảo ngược tên tệp. -
cắt trích xuất trường đầu tiên (
-f1
) bằng cách xác định dấu phân cách trường là một dấu chấm “.
”Và đọc từ“ mặt trước ”của tên tệp đã đảo ngược cho đến khoảng thời gian đầu tiên mà nó tìm thấy. Bây giờ chúng tôi đã giải nén phần mở rộng tệp. - vòng quay đảo ngược trường đầu tiên được trích xuất.
- loại sắp xếp chúng theo thứ tự bảng chữ cái tăng dần.
- uniq liệt kê các mục nhập duy nhất vào cửa sổ đầu cuối.
Lệnh này liệt kê tất cả các phần mở rộng tệp duy nhất trong thư mục hiện tại và bất kỳ thư mục con nào.
Nếu chúng tôi thêm -c
(đếm) tùy chọn uniq
lệnh nó sẽ đếm lần xuất hiện của mỗi loại tiện ích mở rộng. Nhưng nếu chúng ta muốn biết có bao nhiêu phần mở rộng tệp khác nhau, duy nhất, chúng ta có thể bỏ wc
là lệnh cuối cùng trên dòng và sử dụng -l
(dòng) tùy chọn.
find ./* -type f | rev | cut -d'.' -f1 | rev | sort | uniq | wc -l
Và cuối cùng
Đây là một mẹo cuối cùng wc
có thể làm cho bạn. Nó sẽ cho bạn biết độ dài của dòng dài nhất trong một tệp. Đáng buồn thay, nó không cho bạn biết đó là dòng nào. Nó chỉ cung cấp cho bạn chiều dài.
wc -L taf.c
Tuy nhiên, hãy cẩn thận, các tab đó được tính là tám khoảng trắng. Được xem trong trình chỉnh sửa của tôi, có ba tab hai dấu cách ở đầu dòng đó. Độ dài thực của nó là 124 ký tự. Vì vậy, con số được báo cáo được mở rộng một cách giả tạo.
Tôi sẽ xử lý chức năng này với một nhúm muối lớn. Và ý tôi là đừng sử dụng nó. Đầu ra của nó bị sai lệch.
Bất chấp những điều kỳ quặc của nó, wc
là một công cụ tuyệt vời để đưa vào các lệnh được định hình khi bạn cần đếm tất cả các loại giá trị, không chỉ các từ trong tệp.