2009-03-13 36 views
11

Trên máy chủ Linux mà tôi làm việc cùng, quy trình ghi các tệp được đặt tên ngẫu nhiên vào các khoảng thời gian ngẫu nhiên. Dưới đây là một ví dụ nhỏ, hiển thị kích thước tập tin, ngày sửa đổi & thời gian, và tên file:Làm cách nào để tổng hợp các kích thước tệp cùng nhau trong bash, nhóm các kết quả theo ngày?

27659 2009-03-09 17:24 APP14452.log 
0  2009-03-09 17:24 vim14436.log 
20  2009-03-09 17:24 jgU14406.log 
15078 2009-03-10 08:06 ySh14450.log 
20  2009-03-10 08:06 VhJ14404.log 
9044 2009-03-10 15:14 EqQ14296.log 
8877 2009-03-10 19:38 Ugp14294.log 
8898 2009-03-11 18:21 yzJ14292.log 
55629 2009-03-11 18:30 ZjX14448.log 
20  2009-03-11 18:31 GwI14402.log 
25955 2009-03-12 19:19 lRx14290.log 
14989 2009-03-12 19:25 oFw14446.log 
20  2009-03-12 19:28 clg14400.log 

(Lưu ý rằng đôi khi kích thước tập tin có thể không.)

Những gì tôi muốn là một kịch bản bash để tổng hợp kích thước của các tập tin, chia nhỏ theo ngày, sản xuất ra một cái gì đó như thế này (giả sử số học của tôi là chính xác):

27679 2009-03-09 
33019 2009-03-10 
64527 2009-03-11 
40964 2009-03-12 

Kết quả sẽ hiển thị xu hướng hoạt động theo thời gian, và làm nổi bật những ngày đặc biệt bận rộn.

Trong SQL, các hoạt động sẽ là một cinch:

SELECT SUM(filesize), filedate 
FROM files 
GROUP BY filedate; 

Bây giờ, đây là tất cả có lẽ là khá dễ dàng trong Perl hay Python, nhưng tôi thực sự muốn một vỏ bash hoặc dung dịch awk. Nó có vẻ đặc biệt khó khăn với tôi để nhóm các tập tin theo ngày trong bash (đặc biệt là nếu bạn không thể giả định một định dạng ngày cụ thể). Tổng hợp các kích thước có thể được thực hiện trong một vòng lặp tôi giả sử, nhưng là có một cách tiếp cận dễ dàng hơn, thanh lịch hơn,?

+0

thực sự bạn có thể giả dạng ngày với ls -lt --time-style = +% F – vartec

+0

Vâng, cảm ơn vì điều đó. Cùng với giải pháp từ @ashawley, tất cả đều kết hợp với nhau. – yukondude

Trả lời

14

Tôi thường sử dụng thành ngữ này của AWK:

awk '{sum[$2]+= $1;}END{for (date in sum){print sum[date], date;}}' 
+0

Thật đẹp. Tôi đã không nhận ra từ điển hỗ trợ awk đơn giản như vậy. – yukondude

+0

Tôi có thể chỉ định năm ở đâu? – aurelien

2

Tiếp theo những gợi ý từ ashawley và vartec, sau "một lót" không lừa tuyệt vời:

ls -l --time-style=long-iso *log | 
    awk '{sum[$6]+= $5;}END{for (s in sum){print sum[s], s;}}' | 
    sort -k2 | 
    column -t 
1

Hãy xem xét rằng trên Linux bạn có thể có GNU awk, để bạn không cần các lệnh khác:

ls -l --time-style=long-iso * | 
    WHINY_USERS=-9 awk 'END { 
    for (s in sum) 
     printf "%-15s\t%s\n", sum[s], s 
     } 
    { sum[$6]+= $5 } 
    ' 
7

(tìm ... | xargs stat "--printf =% s +"; echo 0) | bc

+0

Đây là một câu trả lời rất hay. Ngoài ra, bạn nên sử dụng 'find -print0 | xargs -0', chỉ trong trường hợp (trừ khi bạn biết tất cả các tệp của bạn được đặt tên là độc đáo). –

-1

Có một công cụ tôi đã tạo cho phép thực hiện các truy vấn giống SQL đối với dữ liệu văn bản, bao gồm nhóm, tham gia, điều kiện và các nội dung khác. Bạn có thể xem here để biết chi tiết.

2

Chỉ những tập tin, đệ quy, được sắp xếp theo ngày và tóm tắt

find ./ -type f -printf '%TY-%Tm-%Td %s\n'|awk '{sum[$1]+= $2;}END{for (date in sum){print date, sum[date];}}'|sort 

Chỉ những tập tin, từ thư mục hiện hành duy nhất, được sắp xếp theo ngày và tóm tắt

find ./ -maxdepth 1 -type f -printf '%TY-%Tm-%Td %s\n'|awk '{sum[$1]+= $2;}END{for (date in sum){print date, sum[date];}}'|sort 
Các vấn đề liên quan