Sử dụng sort 's --stable
, --reverse
, và --key
lựa chọn: (. Đối với mục đích phi giáo khoa, điều này có thể được rút ngắn xuống còn -srk1,2
)
sort --stable --reverse --key=1,2 freeswitch.log
Lệnh sort
(như bạn có thể mong đợi) sẽ xuất mỗi dòng o f các tập tin được đặt tên (hoặc STDIN) theo thứ tự sắp xếp. Có gì mỗi người trong số các tùy chọn này không:
- Tùy chọn
--reverse
nói sort
để sắp xếp dòng với giá trị lớn (sau này là ngày tháng) cao, chứ không phải là thấp.Nó được giả định, dựa trên các câu trả lời khác, rằng đây là những gì bạn có nghĩa là "giảm dần" (mặc dù loại phân loại này thường được coi là "tăng dần"). Nếu bạn muốn sắp xếp các dòng theo trình tự thời gian, bạn sẽ bỏ qua tùy chọn này.
- Tùy chọn
--key=1,2
yêu cầu sort
chỉ sử dụng hai trường "phân tách" khoảng trắng đầu tiên ("freeswitch.log:" - ngày bắt đầu và thời gian) làm khóa để sắp xếp. Điều quan trọng là bạn chỉ định trường trường mới nhất để sử dụng, ngay cả khi bạn chỉ sắp xếp theo một trường (ví dụ: nếu mỗi dòng giữ ngày và giờ cùng nhau trong trường chuẩn ISO-8601 như freeswitch.log 2011-09-08T12:21:07.282236
, bạn sẽ sử dụng -k 2,2
) , theo mặc định, các trường được sử dụng bởi một khóa mở rộng đến cuối dòng.
- Tùy chọn
--stable
yêu cầu sort
không thực hiện "đặt hàng cuối cùng". Không có tùy chọn này, một dòng có hai phím bằng nhau (như được chỉ định với tùy chọn --keys
) sẽ được sắp xếp theo toàn bộ dòng, có nghĩa là tên tệp và/hoặc nội dung sẽ thay đổi thứ tự sắp xếp của các dòng.
Điều quan trọng là phải xác định cả mức độ của --key
, cũng như --stable
tùy chọn. Nếu không có chúng, nhiều dòng đầu ra xảy ra cùng một lúc (nói cách khác là một thông điệp nhiều dòng) sẽ được sắp xếp theo nội dung của thông điệp (không có trường thứ hai trong --key
) và/hoặc tên tệp (không có --stable
) , nếu tên tệp là một trường riêng biệt, như được mô tả bên dưới).
Nói cách khác, một thông báo đăng nhập như thế này:
freeswitch.log:2011-09-08 12:21:10.374238 Warning: Syntax error on line 20:
freeswitch.log:2011-09-08 12:21:10.374238
freeswitch.log:2011-09-08 12:21:10.374238 My[brackets(call)
freeswitch.log:2011-09-08 12:21:10.374238 ^
freeswitch.log:2011-09-08 12:21:10.374238 Suggestion:
freeswitch.log:2011-09-08 12:21:10.374238 did you forget to
freeswitch.log:2011-09-08 12:21:10.374238 close your brackets?
sẽ được "sắp xếp" vào:
freeswitch.log:2011-09-08 12:21:10.374238
freeswitch.log:2011-09-08 12:21:10.374238 ^
freeswitch.log:2011-09-08 12:21:10.374238 close your brackets?
freeswitch.log:2011-09-08 12:21:10.374238 did you forget to
freeswitch.log:2011-09-08 12:21:10.374238 My[brackets(call)
freeswitch.log:2011-09-08 12:21:10.374238 Suggestion:
freeswitch.log:2011-09-08 12:21:10.374238 Warning: Syntax error on line 20:
Đây là "sắp xếp" (vì "c" đi trước " d "và" S "xuất hiện trước" W "), nhưng không phải là theo thứ tự. Chỉ định --stable
(và giữ --key
bị chặn) sẽ bỏ qua việc sắp xếp thêm và giữ nguyên thứ tự, đó là những gì bạn muốn.
Ngoài ra, sắp xếp theo trường tên tệp và ngày kết hợp này sẽ chỉ hoạt động nếu mọi dòng trong đầu ra của bạn bắt đầu bằng cùng một tên tệp. Với cú pháp bạn đã đăng, nếu đầu vào của bạn có nhiều tên tệp khác nhau mà bạn muốn bỏ qua khi sắp xếp, bạn cần sử dụng chương trình như sed
để chuyển đổi tên tệp thành trường được phân tách bằng dấu cách của riêng mình, sau đó đường ống đã chuyển đổi thành sort
(sau đó thì bạn có thể chuyển đổi các thiết bị tách lĩnh vực sau):
sed 's/:/ /' freeswitch.log | sort -srk2,3 | sed 's/ /:/'
Lưu ý rằng các lĩnh vực sử dụng kết thúc bằng phím được thay đổi để 2,3
, bỏ qua những trường đầu tiên (filename).
Không gian là dấu phân cách chung? – ajreal