Lệnh tr Linux là một tiện ích dòng lệnh dùng để chuyển đổi hoặc xóa các ký tự trong dòng dữ liệu đầu vào với cơ chế hoạt động là nhận dữ liệu từ đầu vào tiêu chuẩn (stdin), thao tác thay đổi hoặc loại bỏ các ký tự theo yêu cầu, rồi xuất ra đầu ra tiêu chuẩn (stdout). Trong bài viết này, mình sẽ cung cấp một hướng dẫn toàn diện về lệnh tr trong Linux, từ các khái niệm cơ bản đến những kỹ thuật ứng dụng nâng cao.
Những điểm chính
- Định nghĩa lệnh tr trong Linux: Hiểu rõ khái niệm, mục đích và cú pháp cơ bản của lệnh tr trong việc chuyển đổi, xóa hoặc nén ký tự.
- Cơ chế hoạt động: Nắm được quy trình xử lý dữ liệu của tr để áp dụng lệnh một cách chính xác.
- Các tùy chọn quan trọng: Biết cách sử dụng các tùy chọn chính để thực hiện các thao tác nâng cao như xóa, nén và đảo ngược bộ ký tự.
- 9 ví dụ sử dụng hữu ích: Thành thạo các ứng dụng thực tế của tr, từ chuyển đổi chữ hoa/thường, xóa/nén ký tự, đến chia/gộp dòng văn bản.
- Các nhóm ký tự đặc biệt: Biết cách sử dụng các lớp ký tự như [:lower:], [:upper:], [:digit:] để viết lệnh ngắn gọn và hiệu quả hơn.
- FAQ: Giải đáp chi tiết các thắc mắc khi bạn thao tác với lệnh tr trong Linux.
Lệnh tr Linux là gì?
Lệnh tr (translate) là một công cụ dòng lệnh mạnh mẽ trong Linux dùng để chuyển đổi, xóa hoặc nén các ký tự từ stdin (input) và ghi kết quả ra stdout (output). Đây là lệnh cực kỳ hữu ích khi bạn cần thao tác văn bản trực tiếp trong dòng lệnh mà không cần đến các công cụ chỉnh sửa văn bản phức tạp.
Cấu trúc cú pháp lệnh tr Linux như sau:
$ tr [tùy chọn] [SET1] [SET2]Trong đó:
- SET1: Là một chuỗi ký tự (hoặc một bộ ký tự) mà
trsẽ tìm kiếm trong đầu vào. - SET2: Là một chuỗi ký tự (hoặc một bộ ký tự) tương ứng để thay thế.
Khi không có tùy chọn nào được sử dụng, tr sẽ dịch mỗi ký tự ở vị trí i trong SET1 thành ký tự ở vị trí i trong SET2.

Cơ chế hoạt động của tr trên Linux
Cơ chế hoạt động của tr rất đơn giản và tuân thủ triết lý của Unix:
- Lệnh
trđọc một luồng byte từ đầu vào tiêu chuẩn (stdin). - Sau đó lệnh thực hiện các phép biến đổi như dịch hoặc xóa trên luồng dữ liệu đó.
- Cuối cùng, lệnh ghi kết quả đã được xử lý ra đầu ra tiêu chuẩn (
stdout).
Các thao tác mà tr thực hiện rất đa dạng, bao gồm chuyển đổi chữ hoa/chữ thường, nén các ký tự lặp lại, xóa các ký tự không mong muốn, và thực hiện các hoạt động tìm kiếm, thay thế ở mức độ ký tự.

Các tùy chọn quan trọng của lệnh tr trong Linux
Lệnh tr cung cấp một số tùy chọn mạnh mẽ cho phép người dùng thực hiện các thao tác xóa, nén, và bổ sung.
| Tùy chọn | Chức năng | Mô tả |
|---|---|---|
| -d, –delete | Xóa ký tự | Tùy chọn này hướng dẫn tr xóa tất cả các ký tự được chỉ định trong SET1 khỏi đầu ra. Khi sử dụng -d, SET2 sẽ bị bỏ qua và không có bất kỳ thao tác dịch nào được thực hiện. |
| -s, –squeeze-repeats | Nén ký tự lặp lại | Tùy chọn này thay thế các chuỗi ký tự lặp lại liên tiếp (mà ký tự đó có trong SET1) bằng một lần xuất hiện duy nhất. |
| -c, -C, –complement | Bổ sung (đảo ngược) bộ ký tự: | Thay vì áp dụng thao tác trên các ký tự trong SET1, tùy chọn này sẽ áp dụng lên tất cả các ký tự không có trong SET1. |
| -t, –truncate-set1 | Cắt ngắn SET1 | Theo mặc định, nếu SET1 dài hơn SET2, tr sẽ lặp lại ký tự cuối cùng của SET2. Tùy chọn -t sẽ cắt ngắn SET1 để có cùng độ dài với SET2 trước khi thực hiện dịch. |
9 ví dụ sử dụng lệnh tr hữu ích trong Linux
1. Chuyển đổi chữ thường sang chữ hoa
Đây là một trong những ứng dụng phổ biến nhất của tr, bạn có thể dễ dàng chuyển đổi toàn bộ văn bản từ chữ thường sang chữ hoa và ngược lại.
$ cat linux.txt | tr [:lower:] [:upper:]Trong trường hợp này, khi bạn chạy lệnh trên, kết quả sẽ chuyển toàn bộ chữ cái viết thường trong file linux.txt thành chữ hoa.

2. Lưu kết quả đầu ra vào file
Để lưu dữ liệu đầu ra vào file, bạn thực hiện lệnh sau:
$ cat linux.txt | tr 'a-z' 'A-Z' > output.txtThao tác này giúp bạn chuyển đổi dữ liệu đầu vào từ chữ thường thành hoa và lưu kết quả vào file mới output.txt, rất phù hợp khi bạn cần lưu trữ kết quả xử lý để dùng sau, như xuất báo cáo hoặc phân tích.

3. Kết hợp chuyển hướng input và output
Bạn có thể sử dụng < để chuyển hướng đầu vào từ file linux.txt, đồng thời dùng > để chuyển hướng đầu ra vào file output.txt. Giải pháp này giúp rút ngắn lệnh, loại bỏ nhu cầu dùng cat hoặc pipe |, nhờ đó mã lệnh sẽ trở nên đơn giản và dễ hiểu hơn.
$ tr 'a-z' 'A-Z' < linux.txt > output.txtKết quả hiển thị như sau:

4. Xóa ký tự bằng tùy chọn -d
Sử dụng tùy chọn -d giúp bạn làm sạch dữ liệu, ví dụ: xóa khoảng trắng dư trong tên miền, định dạng email, số điện thoại,… Ví dụ, để xóa khoảng trắng khỏi các tên miền trong file domains.txt, bạn thực thi lệnh sau:
$ cat domains.txt | tr -d ' 'Sau khi chạy lệnh, kết quả hiển thị sẽ xóa tất cả khoảng trắng trong file domains.txt.

5. Nén ký tự lặp
Sử dụng tùy chọn -s hữu ích khi bạn cần xử lý văn bản bị lỗi hoặc bị spam bởi ký tự trùng lặp, ví dụ như khi tên miền bị gõ nhầm như vietnix…..com. Như vậy, để loại bỏ dấu “.” thừa, bạn hãy thực thi lệnh sau:
$ cat domains.txt | tr -s '.'Lệnh sau khi được thực thi sẽ loại bỏ các dấu “.” lặp lại liên tục và chỉ giữ lại 1 dấu duy nhất.

6. Giữ lại hoặc loại bỏ ký tự cụ thể
Bạn có thể sử dụng tùy chọn -c khi muốn tách số hoặc thông tin định dạng cụ thể từ chuỗi văn bản. Trong trường hợp này, để giữ lại số UID, bạn có thể sử dụng tùy chọn -c như sau:
$ echo "My UID is $UID" | tr -cd "[:digit:]\n"Sau khi thực thi, lệnh sẽ chỉ giữ lại số (UID) và dòng mới, đồng thời xóa toàn bộ chữ cái và ký tự khác:

7. Chia câu thành từng dòng
Thao tác này phù hợp khi bạn cần xử lý dữ liệu từng từ hoặc chuẩn bị dữ liệu cho xử lý script dòng lệnh:
$ echo "My UID is $UID" | tr ' ' '\n'Sau khi thực thi lệnh trên, kết quả hiển thị sẽ thay thế khoảng trắng bằng dòng mới, tách từng từ trong câu thành mỗi dòng riêng biệt:

8. Gộp dòng thành một câu
Để gộp dòng thành một câu, bạn thực thi lệnh như sau:
$ tr '\n' ' ' < uid.txtTác dụng của lệnh này là gộp nhiều dòng thành một câu đơn, thay newline (\n) bằng khoảng trắng, phù hợp khi bạn cần nối các dòng lại để xử lý trong một lệnh duy nhất như nối danh sách, tên,…

9. Thay thế ký tự đơn giản
Lệnh dưới đây sử dụng công cụ tr để thay thế toàn bộ ký tự khoảng trắng trong chuỗi đầu vào bằng dấu hai chấm (:), phù hợp khi cần chuyển đổi hoặc chuẩn hóa dữ liệu nhằm phục vụ các mục đích định dạng đặc biệt, chẳng hạn như xuất ra chuỗi có cấu trúc CSV, JSON hoặc tương tác với hệ thống tự động hóa:
$ echo "Tecmint.com =>Linux-HowTos,Guides,Tutorials" | tr ' ' ':'Kết quả hiển thị như sau:

Một số nhóm ký tự đặc biệt
| Nhóm | Ý nghĩa |
| [:lower:] | Chữ thường a-z |
| [:upper:] | Chữ hoa A-Z |
| [:digit:] | Số từ 0 đến 9 |
| [:alpha:] | Tất cả chữ cái |
| [:space:] | Khoảng trắng, tab, newline |
Câu hỏi thường gặp
Vì sao lệnh tr không hoạt động đúng với Unicode?
Lệnh tr trên Linux tiêu chuẩn chỉ hỗ trợ mã ASCII, không xử lý được các ký tự Unicode nhiều byte như tiếng Việt có dấu hoặc emoji, do đó có hiện tượng bỏ sót hoặc chuyển đổi sai ký tự. Nếu cần thao tác Unicode, nên dùng sed, awk hoặc Perl – các công cụ hỗ trợ Unicode tốt hơn.
Khi nào không nên dùng lệnh tr để tránh nguy cơ mất dữ liệu hoặc sai lệch thông tin?
Bạn nên tránh dùng tr khi cần thao tác với tệp văn bản Unicode hoặc dữ liệu phức tạp nhiều cột, nhiều định dạng. Ngoài ra, lệnh tr xóa ký tự theo đúng lệnh mà không kiểm tra ngữ cảnh, dễ gây mất ký tự quan trọng nếu không chú ý.
Có thể kết hợp tr với script bash để tạo bộ lọc tự động cho file log máy chủ không?
Có, bạn có thể dùng tr trong shell script để lọc log và chuẩn hóa đầu vào tự động:
!/bin/bash
cat /var/log/syslog | tr -cd ‘[:alnum:] [:space:][:punct:]\n’ > cleaned_log.txt
Script này giữ lại ký tự chữ cái, số, khoảng trắng, dấu câu để lọc log sạch trước khi xử lý tiếp.
Lệnh tr là một công cụ dòng lệnh mạnh mẽ, linh hoạt cho phép thao tác và xử lý văn bản trực tiếp trên môi trường Linux mà không cần sử dụng các phần mềm chỉnh sửa phức tạp. Nhờ khả năng chuyển đổi, xóa, nén hoặc thay thế ký tự với cú pháp đơn giản, tr giúp tối ưu quá trình chuẩn hóa, lọc và biến đổi dữ liệu đầu vào, tiết kiệm thời gian cho quản trị viên cũng như lập trình viên khi xử lý dữ liệu từ nhiều nguồn khác nhau. Mời bạn tham khảo thêm các lệnh Linux phổ biến và hữu ích khác trong các bài viết dưới đây của mình:




