Sắp xếp và lọc file: các lệnh sort
, uniq
, cut
1. Lệnh sort
Lệnh sort
được thiết kế để sắp xếp các dòng trong tệp văn bản. Nó có thể làm việc với bất kỳ định dạng văn bản nào: từ văn bản phẳng thông thường đến CSV. Theo mặc định, nó sắp xếp các dòng theo thứ tự bảng chữ cái. Tuy nhiên, có rất nhiều tùy chọn, giúp bạn làm được nhiều điều thú vị.
Cú pháp cơ bản
sort [tùy chọn] tệp
Ví dụ đơn giản
Giả sử chúng ta có một tệp names.txt
với nội dung như sau:
Charlie
Alice
Bob
David
Chúng ta có thể sắp xếp nội dung theo thứ tự bảng chữ cái như sau:
sort names.txt
Kết quả:
Alice
Bob
Charlie
David
Các tùy chọn quan trọng của sort
Sắp xếp ngược
Nếu bạn muốn sắp xếp các dòng theo thứ tự giảm dần, hãy sử dụng tùy chọn -r
:
sort -r names.txt
Kết quả:
David
Charlie
Bob
Alice
Sắp xếp số
Đối với số, sắp xếp theo bảng chữ cái có thể không chính xác. Ví dụ, nội dung của tệp numbers.txt
như sau:
10
2
5
1
Sắp xếp theo bảng chữ cái sẽ tạo ra kết quả:
1
10
2
5
Nhưng với tùy chọn -n
(sắp xếp số):
sort -n numbers.txt
Kết quả sẽ chính xác:
1
2
5
10
Khả năng xử lý khoảng trắng
Đôi khi các dòng chứa khoảng trắng ở đầu hoặc cuối. Để sort
không bị nhầm lẫn, bạn hãy sử dụng tùy chọn -b
:
sort -b tap_tin_ban_bua.txt
Ví dụ
Giả sử chúng ta có nhật ký truy cập trang web visits.log
như sau:
user2 15
user1 5
user3 30
user4 20
Chúng ta muốn sắp xếp người dùng theo số lượng truy cập (cột thứ hai). Điều này được thực hiện như sau:
sort -k2 -n visits.log
Trong đó -k2
có nghĩa là "sử dụng cột thứ hai để sắp xếp". Kết quả:
user1 5
user2 15
user4 20
user3 30
2. Lệnh uniq
Lệnh uniq
loại bỏ các dòng trùng lặp trong file. Tuy nhiên, điều quan trọng cần nhớ là: nó chỉ hoạt động với các dòng trùng lặp liền kề. Nghĩa là, nếu các dòng giống nhau xuất hiện ở các phần khác nhau của file, bạn cần sắp xếp chúng trước.
Cú pháp cơ bản
uniq [tuỳ chọn] file
Ví dụ đơn giản
Giả sử chúng ta có một file colors.txt
:
red
green
green
blue
blue
blue
red
Nếu chúng ta chỉ đơn giản sử dụng uniq
:
uniq colors.txt
Kết quả sẽ là:
red
green
blue
red
Xóa các dòng trùng lặp không liên tiếp
Trước tiên, hãy sắp xếp file:
sort colors.txt | uniq
Kết quả:
blue
green
red
Các tuỳ chọn quan trọng của uniq
Đếm số lần lặp lại
Nếu bạn muốn biết mỗi dòng xuất hiện bao nhiêu lần, hãy dùng tuỳ chọn -c
:
sort colors.txt | uniq -c
Kết quả:
3 blue
2 green
2 red
Ví dụ
Trong file access.log
, chúng ta có danh sách địa chỉ IP:
192.168.0.1
192.168.0.2
192.168.0.1
192.168.0.3
192.168.0.1
Chúng ta muốn biết, IP nào xuất hiện nhiều nhất:
sort access.log | uniq -c | sort -rn
Kết quả:
3 192.168.0.1
1 192.168.0.2
1 192.168.0.3
3. Lệnh cut
Lệnh cut
cho phép bạn lấy ra các phần cụ thể của dòng, ví dụ như các cột riêng biệt trong file CSV hoặc các khoảng ký tự.
Cú pháp chính
cut [tùy chọn] file
Ví dụ đơn giản
File data.csv
:
Alice,25,Developer
Bob,30,Designer
Charlie,22,Manager
Lấy ra tên (cột đầu tiên):
cut -d',' -f1 data.csv
Kết quả:
Alice
Bob
Charlie
Trong đó:
-d','
— dấu phân cách (dấu phẩy).-f1
— trường (cột) để lấy ra.
Các tùy chọn chính của cut
Chọn khoảng ký tự
Nếu file data.csv
của chúng ta có độ rộng cột cố định:
Alice 25 Developer
Bob 30 Designer
Charlie 22 Manager
Chúng ta có thể lấy ra chỉ tuổi (ký tự từ 12 đến 14):
cut -c12-14 data.csv
Kết quả:
25
30
22
Chọn nhiều trường
Nếu chúng ta có file log.csv
:
2023-01-01,INFO,Server started
2023-01-02,ERROR,Connection failed
2023-01-03,INFO,Server stopped
Chọn chỉ ngày và mức độ log (các trường 1 và 2):
cut -d',' -f1,2 log.csv
Kết quả:
2023-01-01,INFO
2023-01-02,ERROR
2023-01-03,INFO
4. Ví dụ thực tế: Kết hợp sort
, uniq
và cut
Chúng ta lấy một tệp log có nội dung như thế này:
user1,192.168.0.1
user2,192.168.0.2
user1,192.168.0.1
user3,192.168.0.3
user2,192.168.0.2
- Trích xuất các địa chỉ IP:
cut -d',' -f2 log.txt
- Loại bỏ các bản sao và đếm chúng:
cut -d',' -f2 log.txt | sort | uniq -c
- Sắp xếp theo số lần xuất hiện:
cut -d',' -f2 log.txt | sort | uniq -c | sort -rn
Kết quả:
2 192.168.0.2
2 192.168.0.1
1 192.168.0.3
GO TO FULL VERSION