2011-09-08 31 views
10

Tôi có một logfile với các mục như:loại logfile bởi dấu thời gian trên Linux dòng lệnh

...  
freeswitch.log:2011-09-08 12:21:07.282236 [ERR] ftdm_queue.c:136 Failed to enqueue obj 0x7f2cda3525c0 in queue 0x7f2ce8005990, no more room! windex == rindex == 58! 
freeswitch.log:2011-08-08 13:21:07.514261 [ERR] ftdm_queue.c:136 Failed to enqueue obj 0x7f2cda354460 in queue 0x7f2ce8005990, no more room! windex == rindex == 58! 
freeswitch.log:2011-06-04 16:21:08.998227 [ERR] ftdm_queue.c:136 Failed to enqueue obj 0x7f2cda356300 in queue 0x7f2ce8005990, no more room! windex == rindex == 58! 
freeswitch.log:2011-09-08 12:21:10.374238 [ERR] ftdm_queue.c:136 Failed to enqueue obj 0x7f2cda3581a0 in queue 0x7f2ce8005990, no more room! windex == rindex == 58! 
... 

Làm thế nào tôi có thể sắp xếp các tập tin với các công cụ dòng lệnh Linux bởi dấu thời gian trong mỗi hàng decending?

+0

Không gian là dấu phân cách chung? – ajreal

Trả lời

9

cờ -k Sử dụng sort 's:

sort -k1 -r freeswitch.log 

Điều đó sẽ sắp xếp các tập tin, ngược lại, kết thúc bằng phím đầu tiên (tức freeswitch.log: 2011/09/08 12: 21: 07.282236). Nếu tên tệp luôn giống nhau (freeswitch.log), thì nó sẽ sắp xếp theo ngày tháng.

+1

Nếu không chỉ định trường kết thúc hoặc cờ '-s',' -k1' đó là vô nghĩa. Xem phần giải thích trong [câu trả lời của tôi] (http://stackoverflow.com/a/29508361/34799). –

0

Các file log dường như tăng dần, bạn có thể

tac yourlogfile 

mà reversely sẽ hiển thị tập tin đăng nhập của bạn.

+0

Các mục nhập không được sắp xếp đầy đủ theo dấu thời gian chưa – markus

0

Tôi đoán tệp nhật ký sẽ nối thêm dữ liệu mới vào cuối. Nếu có, bạn có thể đọc tập tin ngược lại. Hãy thử với đuôi -r hoặc cat lệnh.

+0

không có dữ liệu bổ sung, tôi đã grep các dòng tôi muốn phân tích từ tệp nhật ký ban đầu vào tệp mới. – markus

1

Bạn có thể đảo ngược các loại với

sort -r 
+0

nhưng cách phân loại theo dấu thời gian trong hàng. Lưu ý rằng chúng chưa được đặt hàng (tôi thay đổi nó trong câu hỏi của tôi) – markus

+0

Nếu tôi hiểu bình luận của bạn một cách chính xác, câu trả lời này là: grep ftdm_queue.c freeswitch.đăng nhập | sắp xếp -r # đây là một đoán như bạn đã cung cấp đầy đủ dòng lệnh của bạn. –

1

kỹ thuật thô nhưng hiệu quả: Tiền tố mỗi dòng với một số đại diện của ngày, sắp xếp số lượng, sau đó loại bỏ các thông tin thêm.

oneliner:

while IFS=' ' read -r name_date trailing ; do date=$(cut -d: -f2 <<<"$name_date") ; printf '%s:%s\n' $(date -d "$date" +%s) "$name_date $trailing" ; done < freeswitch.log | sort -k1 -t: | cut -d: -f2- 

Shell script:

#!/usr/bin/env bash 

logfile="$1" 

if [ -f "$logfile" ] ; then 
    while IFS=' ' read -r name_date trailing ; do 
      date=$(cut -d: -f2 <<<"$name_date") 
     printf '%s:%s\n' $(date -d "$date" +%s) "$name_date $trailing" 
    done < "$logfile" | sort -k1 -t: | cut -d: -f2- 
fi 

Lưu ý: Yêu cầu ngày GNU.

Nếu đầu ra tại điểm này ngược lại với những gì bạn muốn, đơn giản là đường ống qua tac hoặc sửa đổi tập lệnh cũng để chuyển -r đến sort.

EDIT: Tôi đã bỏ lỡ phần tên tệp theo nghĩa đen trên mỗi dòng. Phiên bản cập nhật giờ sẽ thực sự hoạt động.

1

Bạn có thể thử sử dụng loại

sort -k1,2 file 
+0

Ngay cả với một trường kết thúc được chỉ định, so sánh khu nghỉ mát cuối cùng làm cho nó để '-k1,2' cuối cùng không có nghĩa là nhiều của bất cứ điều gì. Xem phần giải thích về '- stable' trong [câu trả lời của tôi] (http://stackoverflow.com/a/29508361/34799). –

10

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).

Các vấn đề liên quan