ファイルからn行ごとに収集

ファイルからn行ごとに収集

HTTP経由でストリーミングする必要がある大容量ログファイルがあります。パフォーマンス上の理由から、すべてのアイテムをキャプチャ/収集したいと思います。N確認して送信してください。だから基本的に私が望むのは、ファイルのバッファリングされた出力n行です。これを達成するためのtail / headまたは他のLinuxコマンドはありますか?

ベストアンサー1

awk「送信データ」ディレクトリを別々に分割して監視するinotifywait組み合わせをお勧めします。たとえば、「outgoing」というディレクトリを作成すると、新しいファイルが表示されるたびにそのファイルが送信されます。

スクリプト1awk10行ごとに分割し、数字Xを増やして新しいファイル「bufferX」に書き込みます。必要に応じて調整します。

$cat split.awk

NR%10==1 {buffer="buffer"++i}

{
print > buffer
if (NR%%10==0) {system("mv "buffer" outgoing/")}
}

スクリプト2:発信ディレクトリを監視し、新しいログ配置が表示されたらデータを送信します。私はあなたがcurl転送に使用していると仮定しています。それに応じて調整してください。

$cat watch_dir.sh

#!/bin/bash
inotifywait -m -o watch.logs -e moved_to --format '%w%f' outgoing/  |\
while read bufferfile
do
    curl -T ${bufferfile} http://taget.url && rm ${bufferfile}
done

これは「送信」ファイルのinotifywaitディレクトリを監視し、モニタモードで無限に実行され、「watch.logs」でlgsを実行し、パスとファイル名で検出されたファイルを印刷します。最後の部分ではコマンドを読み、アップロード後にファイルを削除します。-emoved_to-m-o--formatcurl

発信ディレクトリを作成し、次を実行します。

bash watchdir.sh & <your_command_creating_output> | awk -f split.awk

おすすめ記事