Có rất nhiều tiện ích có sẵn trong các hệ thống Linux và Unix cho phép bạn xử lý và lọc các tệp văn bản. cut là một tiện ích dòng lệnh cho phép bạn cắt các phần của dòng từ các tệp hoặc dữ liệu được chỉ định và in kết quả ra đầu ra tiêu chuẩn. Nó có thể được sử dụng để cắt các phần của một dòng theo dấu phân cách, vị trí byte và ký tự.

Trong bài viết này, chúng ta sẽ tìm hiểu cách sử dụng cut thông qua các ví dụ thực tế và giải thích chi tiết về các tùy chọn phổ biến nhất.

Cách sử dụng

Cú pháp của cut như sau:

cut OPTION... [FILE]...

Các tùy chọn cho biết cut nên sử dụng dấu phân cách, vị trí byte hoặc ký tự khi cắt các phần đã chọn trên các dòng như sau:

  • -f--fields=LIST) – Chọn bằng cách chỉ định một trường, một tập hợp các trường hoặc một phạm vi trường. Đây là tùy chọn được sử dụng phổ biến nhất.
  • -b--bytes=LIST) – Chọn bằng cách chỉ định một byte, một tập hợp các byte hoặc một dải byte.
  • -c--characters=LIST) – Chọn bằng cách chỉ định một ký tự, một bộ ký tự hoặc một dải ký tự.

Bạn có thể sử dụng một và chỉ một trong các tùy chọn được liệt kê ở trên.

Các tùy chọn khác là:

  • -d--delimiter) – Chỉ định một dấu phân cách sẽ được sử dụng thay cho dấu phân cách “TAB” mặc định.
  • --complement– Bổ sung cho việc lựa chọn. Khi sử dụng tùy chọn này cut sẽ hiển thị tất cả các byte, ký tự hoặc trường ngoại trừ các trường đã chọn.
  • -s--only-delimited) – Theo mặc định cut in các dòng không chứa ký tự phân cách. Khi tùy chọn này được sử dụng, cut không in các dòng không chứa dấu phân cách.
  • --output-delimiter– Hành vi mặc định của cut là sử dụng dấu phân cách đầu vào làm dấu phân cách đầu ra. Tùy chọn này cho phép bạn chỉ định một chuỗi dấu phân cách đầu ra khác.

Lệnh cut có thể chấp nhận không hay nhiều tên FILE đầu vào. Nếu không FILE được chỉ định hoặc khi nào FILE là -cut sẽ đọc từ đầu vào chuẩn (stdin).

Các tham số LIST truyền cho -f-b và -c có thể là một số nguyên, đa số nguyên cách nhau bằng dấu phẩy, một loạt các số nguyên hoặc nhiều dãy số nguyên cách nhau bởi dấu phẩy. Mỗi phạm vi có thể là một trong những phạm vi sau:

  • N trường, byte hoặc ký tự thứ N, bắt đầu từ 1.
  • N- từ trường thứ N, byte hoặc ký tự, đến cuối dòng.
  • N-M từ trường thứ N đến trường thứ M, byte hoặc ký tự.
  • -M từ trường, byte hoặc ký tự đầu tiên đến trường thứ M.

Cách cắt theo trường

Để chỉ định các trường sẽ bị cắt, hãy gọi lệnh với tùy chọn -f. Khi không được chỉ định, dấu phân tách mặc định là “TAB”.

Trong các ví dụ dưới đây, chúng ta sẽ sử dụng tệp sau. Các trường được phân tách bằng các tab.test.txt

245:789 4567    M:4540  Admin   01:10:1980
535:763 4987    M:3476  Sales   11:04:1978

Ví dụ: để hiển thị trường thứ nhất và thứ ba, bạn sẽ sử dụng:

cut test.txt -f 1,3
245:789    M:4540
535:763 M:3476

Hoặc nếu bạn muốn hiển thị từ trường thứ 1 đến thứ 4:

cut test.txt -f -4
245:789    4567    M:4540  Admin
535:763 4987    M:3476  Sales

Cách cắt dựa trên dấu phân cách

Để cắt dựa trên dấu phân cách, hãy gọi lệnh với tùy chọn -d, sau đó là dấu phân cách bạn muốn sử dụng.

Ví dụ: để hiển thị trường thứ nhất và thứ ba sử dụng “:” làm dấu phân cách, bạn sẽ nhập:

cut test.txt -d ':' -f 1,3
245:4540   Admin   01
535:3476    Sales   11

Bạn có thể sử dụng bất kỳ ký tự đơn nào làm dấu phân cách. Trong ví dụ sau, chúng ta đang sử dụng ký tự khoảng trắng làm dấu phân cách và in trường thứ 2:

echo "Lorem ipsum dolor sit amet" | cut -d ' ' -f 2
ipsum

Cách bổ sung lựa chọn

Để bổ sung tùy chọn --complement sử dụng danh sách trường lựa chọn. Thao tác này sẽ chỉ in những trường không được chọn với tùy chọn -f.

Lệnh sau sẽ in tất cả các trường ngoại trừ trường thứ nhất và thứ ba:

cut test.txt -f 1,3 --complement
4567   Admin   01:10:1980
4987    Sales   11:04:1978

Cách chỉ định dấu phân cách đầu ra

Để chỉ định dấu phân cách đầu ra, hãy sử dụng tùy chọn --output-delimiter. Ví dụ, để đặt dấu phân cách đầu ra, _bạn sẽ sử dụng:

cut test.txt -f 1,3 --output-delimiter='_'
245:789_M:4540
535:763_M:3476

Cách cắt theo byte và ký tự

Trước khi đi xa hơn, hãy phân biệt giữa byte và ký tự.

Một byte là 8 bit và có thể đại diện cho 256 giá trị khác nhau. Khi tiêu chuẩn ASCII được thành lập, nó đã tính đến tất cả các chữ cái, số và ký hiệu cần thiết để làm việc với tiếng Anh. Bảng ký tự ASCII có 128 ký tự và mỗi ký tự được biểu diễn bằng một byte. Khi máy tính bắt đầu có khả năng truy cập toàn cầu, các công ty công nghệ bắt đầu giới thiệu các bảng mã ký tự mới cho các ngôn ngữ khác nhau. Đối với các ngôn ngữ có nhiều hơn 256 ký tự, không thể thực hiện một ánh xạ 1 đến 1 đơn giản. Điều này dẫn đến các vấn đề khác nhau như chia sẻ tài liệu hoặc duyệt các trang web, và một tiêu chuẩn Unicode mới có thể xử lý hầu hết các hệ thống chữ viết trên thế giới là cần thiết. UTF-8 được tạo ra để giải quyết những vấn đề này. Trong UTF-8, không phải tất cả các ký tự đều được biểu diễn bằng 1 byte. Các ký tự có thể được biểu diễn bằng 1 byte đến 4 byte.

Các tùy chọn -b--bytes) cho lệnh để phần cắt từ mỗi dòng được xác định bởi vị trí byte nhất định.

Trong các ví dụ sau, chúng ta đang sử dụng ký tự ü có 2 byte.

Chọn byte thứ 5:

echo 'drüberspringen' | cut -b 5
b

Chọn các byte thứ 5, 9 và 13:

echo 'drüberspringen' | cut -b 5,9,13
bpg

Chọn phạm vi từ byte thứ nhất đến thứ năm:

echo 'drüberspringen' | cut -b 1-5
drüb

Tại thời điểm viết bài này, phiên bản cut trong lõi GNU không có tùy chọn cắt theo ký tự. Khi sử dụng tùy chọn -ccut hoạt động giống như khi sử dụng tùy chọn -b.

Ví dụ

Lệnh cut thường được sử dụng kết hợp với các lệnh khác thông qua pipeline. Đây là vài ví dụ:

Nhận danh sách tất cả người dùng

Đầu ra của lệnh getent passwd được chuyển tới cut, trường này sẽ in ra trường đầu tiên sử dụng : làm dấu phân cách.

getent passwd | cut -d ':' -f1

Đầu ra hiển thị danh sách tất cả người dùng hệ thống .

Xem 10 lệnh được sử dụng thường xuyên nhất

Trong ví dụ sau, cut được sử dụng để tách 8 byte đầu tiên từ mỗi dòng của history đầu ra lệnh.

history | cut -c8- | sort | uniq -c | sort -rn | head

Phần kết luận

cut lệnh được sử dụng để hiển thị các trường đã chọn từ mỗi dòng của tệp nhất định hoặc đầu vào chuẩn.

Mặc dù rất hữu ích, cut có một số hạn chế. Nó không hỗ trợ chỉ định nhiều hơn một ký tự làm dấu phân cách và cũng không hỗ trợ nhiều dấu phân cách.

Nếu bạn có bất kỳ câu hỏi hoặc phản hồi nào, vui lòng để lại bình luận.

0 0 votes
Article Rating
Subscribe
Notify of
guest
1 Comment
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Dân
Dân
4 months ago

rất hữu ích cảm ơn tác giả