我有一個shell腳本,每小時通過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個while循環來執行各種檢查。
callref.log文件由呼叫標識符值組成,每小時它將有大約50-90,000個值,腳本需要大約45-50分鐘才能完成執行並向我發送報告。
如果我能夠縮短循環的執行時間,那將會非常有幫助。由於sample.log文件的大小約爲20 GB,並且對於每個循環打開文件並執行搜索,因此我認爲while循環是此處的瓶頸。
但解決方案建議我不能執行或者不知道怎麼樣。任何建議都會有所幫助。謝謝
由於sample.log包含敏感信息,我將無法共享任何日誌,但以下是我從互聯網上獲取的一些示例日誌。
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由行的列表,它看起來像的 -
C-001ec22d
C-001ec23d
C-001ec24d
C-001ec31d
C-001ec80d
此外,上面的期望輸出而循環如下所示C-001ec80d
另外我的主關心的是讓while循環運行得更快。就像加載數組中的callref.log的所有值一樣,如果可能的話,同時在sample.log的一次傳遞中搜索所有值。
可能值得研究的例如。 grep的'-F'標誌,這可以提高前兩個greps的性能,因爲你使用的是固定字符串(但不要用於最後一個)。有一些很好的提示[這裏](https://stackoverflow.com/questions/13913014/grepping-a-huge-file-80gb-any-way-to-speed-it-up)這應該有所幫助。 – hnefatl
你的意思是你不能使用awk? –
您如何發佈一些'sample.log'和'callref.log'以及期望的輸出,我相信我們可能會對您有所幫助。 –