私は、cronジョブを介して毎時呼び出され、アスタリスクログを検索し、原因31で終わった呼び出しのユニークなIDを提供するシェルスクリプトを持っています。Grep巨大なログファイルのパターンが多い
while read ref
do
cat sample.log | grep "$ref" | grep 'got hangup request, cause 31' | grep -o 'C-[0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z]' >> cause_temp.log
done < callref.log
問題は、whileループが遅すぎることです。正確さのために、上記のようなループを4回追加してさまざまなチェックを実行しました。
callref.logファイルはコール識別子の値で構成され、約50〜90,000の値を持ち、スクリプトは実行を完了してレポートをメールで送信するのに約45〜50分かかります。
私はループの実行時間を短縮することができたら大いに役立つでしょう。 sample.logファイルのサイズは約20 GBなので、ループごとにファイルが開かれて検索が実行されるので、whileループがボトルネックになっていると思いました。
のようないくつかの有用なリンクを発見した。しかし解決策は、私は実装できないか、どのように知りませんが示唆されています。どんな提案も役に立ちます。ありがとう
sample.logは機密情報で構成されているため、ログを共有することはできませんが、インターネットから入手したサンプルログは以下のとおりです。また
C-001ec22d
C-001ec23d
C-001ec24d
C-001ec31d
C-001ec80d
上記の所望の出力ループはまた、C-001ec80d
のように見えながら、私のメイン -
Dec 16 18:02:04 asterisk1 asterisk[31774]: NOTICE[31787]: chan_sip.c:11242 in handle_request_register: Registration from '"503"<sip:[email protected]>' failed for '192.168.1.137' - Wrong password
Dec 16 18:03:13 asterisk1 asterisk[31774]: NOTICE[31787]: chan_sip.c:11242 in handle_request_register: Registration from '"502"<sip:[email protected]>' failed for '192.168.1.137' - Wrong password
Dec 16 18:04:49 asterisk1 asterisk[31774]: NOTICE[31787]: chan_sip.c:11242 in handle_request_register: Registration from '"1737245082"<sip:[email protected]>' failed for '192.168.1.137' - Username/auth name mismatch
Dec 16 18:04:49 asterisk1 asterisk[31774]: NOTICE[31787]: chan_sip.c:11242 in handle_request_register: Registration from '"100"<sip:[email protected]>' failed for '192.168.1.137' - Username/auth name mismatch
Jun 27 18:09:47 host asterisk[31774]: ERROR[27910]: chan_zap.c:10314 setup_zap: Unable to register channel '1-2'
Jun 27 18:09:47 host asterisk[31774]: WARNING[27910]: loader.c:414 __load_resource: chan_zap.so: load_module failed, returning -1
Jun 27 18:09:47 host asterisk[31774]: WARNING[27910]: loader.c:554 load_modules: Loading module chan_zap.so failed!
ファイルcallref.logは次のように見えるラインのリストから成りwhileループの実行を高速化することが重要です。配列内のcallref.logのすべての値をロードし、可能であればsample.logの単一パスですべての値を同時に検索するのと同様です。
は次のようになります例えば価値があると考える価値がある。 grepの '-F'フラグは固定文字列を使用しているときに最初の2つのgrepのパフォーマンスを向上させる可能性があります(最後の文字列は使用しません)。役に立つはずのヒントがあります(https://stackoverflow.com/questions/13913014/grepping-a-huge-file-80gb-any-way-to-speed-it-up)。 – hnefatl
あなたはawkを使うことができないのですか? –
'sample.log'と' callref.log'と予想される出力を投稿してください。私はあなたに助けになるかもしれないと信じています。 –