2009-03-13 7 views
11

私が扱っているLinuxサーバでは、ランダムな名前のファイルをランダムな間隔で書き込みます。ここでは、小さなファイルサイズを示すサンプル、変更日&時間、およびファイル名です:ファイルサイズをbashで合計するには、結果を日付別にグループ化しますか?

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 

は(。時々、ファイルサイズがゼロになることに注意してください)

私が望むどのようなbashスクリプトです

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

結果は時間をかけての活動の傾向を示すだろう、と非常に忙しい日ハイライト:(私の算術が正しいと仮定して)、このような出力に何かを生産する、日付別に分類ファイルのサイズを合計します。 SQLで

、操作は楽勝のようになります。今

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

、これはすべて、おそらくPerlやPythonで非常に簡単ですが、私は本当にbashシェルやawkのソリューションを好むだろう。ファイルを日付でbashでグループ化するのは特に難しいようです(特に、特定の日付形式を想定できない場合)。サイズを集計することは、私が想定しているループで行うことができますが、より簡単でよりエレガントなアプローチですか?私は、多くの場合のawkこのイディオムを使用

+0

を合算-lt --time-style = +%F – vartec

+0

はい、ありがとうございます。 @ashawleyのソリューションと一緒に、それはすべて一緒に来ました。 – yukondude

答えて

14

:ashawleyとvartecからの提案に続き

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

それは美しいです。私はawkでサポートされている辞書をとても簡単に理解できませんでした。 – yukondude

+0

年はどこで指定できますか? – aurelien

2

を、以下の "ワンライナーは" 見事なトリックをん:

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

は、Linux上でそれを考えてみましょうあなたはおそらく、あなたが他のコマンドを必要としないGNU AWK、 を持っている:

​​3210
7

(find ... | xargs stat "--printf =%s +";エコー0)| bc

+0

これは非常に良い答えです。また、 'find -print0 | xargs -0'を実行します(あなたのファイルがすべてうまく名づけられていない限り)。 –

-1

グルーピング、ジョイン、条件などのテキストデータに対してSQLのようなクエリを実行できるツールを作成しました。詳細はhereをご覧ください。

2

のみのファイルは、再帰的に、日付でソートされ、現在のディレクトリのみから、

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

ファイルのみを合計し、日付順に並べ替えられ、実際にあなたがLSで日付形式をとることができる

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 
関連する問題