ログファイルを崩壊させるbashスクリプトを作成しました。bashスクリプトでのパフォーマンスの問題
21 Oct 2017 12:38:03 [DEBUG] Single line message
21 Oct 2017 12:38:05 [DEBUG] Multi line
message
that may continue
several lines
21 Oct 2017 12:38:07 [DEBUG] Single line message
は、区切り文字付きシングル並ぶのファイルにログファイルを折りたたむ:
21 Oct 2017 12:38:03 [DEBUG] Single line message
21 Oct 2017 12:38:05 [DEBUG] Multi line; message; that may continue; several lines
21 Oct 2017 12:38:07 [DEBUG] Single line message
次のbashスクリプトは、この目標を達成したが、耐え難いほど遅いペースで形式のログファイルを考えます。 500mbの入力ログは、8コア32GBマシンで30分かかることがあります。
while read -r line; do
if [ -z "$line" ]; then
BUFFER+=$LINE_SEPERATOR
continue
done
POSSIBLE_DATE='cut -c1-11 <<< $line'
if [ "$PREV_DATE" == "$POSSIBLE_DATE" ]; then # Usually date won't change, big comparison saving.
if [ -n "$BUFFER" ]; then
echo $BUFFER
BUFFER=""
fi
BUFFER+="$line"
elif [[ "$POSSIBLE_DATE" =~ ^[0-3][0-9]\ [A-Za-z]{3}\ 2[0-9]{3} ]]; then # Valid date.
PREV_DATE="$POSSIBLE_DATE"
if [ -n "$BUFFER" ]; then
echo $BUFFER
BUFFER=""
fi
BUFFER+="$line"
else
BUFFER+="$line"
fi
done
どのように私はこのスクリプトを最適化できますか?正規表現がボトルネック(私の最初の最適化)であるようには見えません。
ログファイル内の行のほとんどは1行であるため、最初の11文字を比較すると計算コストが高くなるとは思われません。
ありがとうございました。
ただPythonを使用してください。それは、あなたが1行を読むたびにプロセスを産み出すよりずっと良いでしょう。または、AWKを使用します。 –
'POSSIBLE_DATE = 'cut -c1-11 <<< $ line''コピー&ペーストの問題がない限り、あなたの状態はテストしていません。 – Mat