CodeGym /Các khóa học /Docker SELF /Sắp xếp và lọc file: các lệnh `sort`, `uniq`, `cut`

Sắp xếp và lọc file: các lệnh `sort`, `uniq`, `cut`

Docker SELF
Mức độ , Bài học
Có sẵn

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, uniqcut

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
  1. Trích xuất các địa chỉ IP:
cut -d',' -f2 log.txt
  1. Loại bỏ các bản sao và đếm chúng:
cut -d',' -f2 log.txt | sort | uniq -c
  1. 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
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION