アプリケーションログファイルの最大tpsを計算するbashスクリプトがあります。スクリプトは機能しますが、何百万ものエントリがあるファイルで実行するのに数時間かかります。ログエントリには次のパターンがあります。
2015-11-01 14:34:20,969 TRACE [Thread-2868] [TrafficLogger] service transaction data
2015-11-01 14:34:20,987 TRACE [Thread-2868] [TrafficLogger] service transaction data
スクリプトには、可能なすべての時:分:秒の組み合わせを特定し、各組み合わせの一致数を計算するループがあり、毎回前の最高数と比較して最高TPSを更新します。
for h in {00..23}; do
for m in {00..59}; do
for s in {00..59}; do
tps=$(grep -c "${h}:${m}:${s}" $log_file)
if [ "$tps" -gt "$peak_tps" ]; then
peak_tps=$tps
fi
done
done
done
これは最大TPSを計算する簡単な方法ですが、入力の経験的方法を使用して最適化する方法があるかどうか疑問に思います。 (1)入力ファイルはタイムスタンプでソートされます。一日のアイテムです(つまり、最初の列は一定です)。
私はいくつか試してみました。 (1)--mmap
に追加し、grep
(2)すべてのタイムスタンプを事前に検索し、その項目のみを検索します。
for timestamp in $(awk '{print $2}' $log_file | cut -d \, -f 1 | sort -u); do
tps=$(grep --mmap -c "${h}:${m}:${s}" $log_file)
...
どちらも大幅に改善されていません。私はこれが古典的なテスト問題であると確信していますが、答えが見つからないようです。助けてもらえますか?
あいさつ!
答え1
次のコマンドは、単にログファイルからタイムスタンプ(文字12-19)を傍受して(並べ替えられたと仮定して)、それを実行してuniq -c
各固有エントリ(タイムスタンプ)の数を生成します。パイプラインの残りの部分は、最も高い最初の(数)列に基づいて結果出力をソートし、最初の結果を表示します。
cut -c12-19 $log_file | uniq -c | sort -rn | head -1
または、作ってみてください...sort -n | tail -1