【发布时间】:2017-08-22 15:30:00
【问题描述】:
我有一个 shell 脚本,它通过 cron 作业每小时调用一次,用于搜索星号日志并为我提供以原因 31 结束的呼叫的唯一 ID。
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 循环是这里的瓶颈。
已完成研究并找到了一些有用的链接,例如 Link 1Link 2
但建议的解决方案我无法实施或不知道如何实施。任何建议都会有所帮助。谢谢
由于 sample.log 包含敏感信息,我无法分享任何日志,但以下是我从互联网上获得的一些示例日志。
Dec 16 18:02:04 asterisk1 asterisk[31774]: NOTICE[31787]: chan_sip.c:11242 in handle_request_register: Registration from '"503"<sip:503@192.168.1.107>' 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:502@192.168.1.107>' 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:1737245082@192.168.1.107>' 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:100@192.168.1.107>' 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
上述while循环的期望输出看起来像C-001ec80d
另外,我主要关心的是让 while 循环运行得更快。就像将 callref.log 的所有值加载到一个数组中一样,如果可能的话,在一次 sample.log 中同时搜索所有值。
【问题讨论】:
-
可能值得研究一下。 grep 的
-F标志,当您使用固定字符串时,这可能会提高前两个 grep 的性能(但不要将它用于最后一个)。有一些很好的提示 here 应该会有所帮助。 -
你的意思是你不能使用awk?
-
您如何发布一些
sample.log和callref.log以及预期的输出,我相信我们可能会对您有所帮助。 -
@hnefatl - 这不是查询耗时,而是耗时的 while 循环
-
@Maurice Perry - 我可以使用 awk,但我不熟悉它,您可以通过示例提出任何想法
标签: shell