0

var/log ディレクトリに次の名前で毎日保存される多くのログがあります。

log20130601 log20130602 log20130603 ...

各ログには多くの行があります。たとえば、log20130529 を開くと、次のようになります。

    2013-05-29T15:55:05 [INFO] access_time:1369810505, item_id:1, start, 
    2013-05-29T15:55:05 [INFO] access_time:1369810505, item_id:2, start, 
    ....

私がやりたいことは、最後の 7 つのファイルをグループ化するファイルを作成することです。たとえば、今日が 20130611 の場合、スクリプトを実行すると、log20130611、log20130610、log 20130609、log20130608、log20130607、log20130606、および log201305 のコンテンツが含まれる一時ファイルを作成できます。たとえば、すべてのファイルが 4 行だった場合、新しい一時ファイルは 28 行になるはずです。

これまでのところ、「グロブ」を使用して最後の7つのファイルを読み取る方法を知っています:

    my @file_locations = reverse sort glob("/home/adrian/app/var/log/log*");                                                                               
    if ( @file_locations > 7 ) { $#file_locations = 6; }    

しかし、それらを単一のファイルにグループ化する方法がわかりません。何か案は?

4

2 に答える 2

0

Perl をまだ使用していない場合、またはこれを既存のスクリプトに追加したくない場合は、次のようにします。

cat $(ls /home/adrian/app/var/log/log*|head -7) > /home/adrian/app/var/log/combined.log

それ以外の場合は、池上のソリューションで問題ありません。strace が perl があまりにも多くの syscall を使用し、I/O が少なすぎることを明らかにした場合、選択したバッファ サイズで sysread/syswrite にドロップダウンできます。

于 2013-06-11T05:40:59.260 に答える