需要减少执行时间

时间:2018-01-25 14:47:35

标签: linux bash shell unix scripting

我们正在尝试执行以下脚本,以查找日志文件中特定单词的出现 需要建议来优化脚本。

测试日志大小 - 大约500到600 MB

$ wc -l Test.log

16609852 Test.log

po_numbers - 11到12k po搜索

$ more po_numbers

xxx1335
AB1085
SSS6205
UY3347
OP9111
....and so on 

当前执行时间 - 2.45小时

while IFS= read -r po
do
check=$(grep -c "PO_NUMBER=$po" Test.log)
echo $po "-->" $check >>list3

if [ "$check" = "0" ]
then
echo $po >>po_to_server
#else break
fi
done < po_numbers

4 个答案:

答案 0 :(得分:2)

执行

时,您正在读取大文件太多次

Warning message: In new_result(connection@ptr, statement) : Cancelling previous query

您可以尝试将大文件拆分为较小的文件或将模式写入文件并使grep使用

grep -c "PO_NUMBER=$po" Test.log

然后

echo -e "PO_NUMBER=$po\n" >> patterns.txt

答案 1 :(得分:1)

$ grep -Fwf <(sed 's/.*/PO_NUMBER=&/' po_numbers) Test.log

从po_numbers(进程替换)创建查找文件,检查日志文件中的文字匹配。这假设搜索到的PO_NUMBER = xxx是一个单独的单词,如果不是删除-w,也假设没有正则表达式而只是文字匹配,如果不是删除-F,但两者都会减慢搜索速度。

答案 2 :(得分:0)

使用Grep:

sed -e 's|^|PO_NUMBER=|' po_numbers | grep -o -F -f - Test.log | sed -e 's|^PO_NUMBER=||' | sort | uniq -c > list3
grep -o -F -f po_numbers list3 | grep -v -o -F -f - po_numbers > po_to_server

使用awk:

这个awk程序可能会更快地运行

awk '(NR==FNR){ po[$0]=0; next }
     { for(key in po) {
         str=$0
         po[key]+=gsub("PO_NUMBER="key,"",str)
       }
     }
     END { 
       for(key in po) {
          if (po[key]==0) {print key >> "po_to_server" }
          else            {print key"-->"po[key] >> "list3" }
       }
     }' po_numbers Test.log

执行以下操作:

  • 第一行从文件po_numbers
  • 加载po个键
  • 第二个awk解析器将解析文件每行PO_NUMBER=key的出现次数。 (gsub是执行替换并返回替换计数的函数)
  • 最后,我们将请求的输出打印到请求的文件。

这里的假设是,可能有多个模式可能在Test.log的单行上多次出现

评论:不会满足po_numbers的原始顺序。

答案 3 :(得分:-1)

&#34;发现事件&#34; 不确定是否要计算每个搜索单词的出现次数,或者输出日志中包含至少一个搜索单词的行。这是你在后一种情况下解决它的方法:

(cat po_numbers; echo GO; cat Test.log) | \
    perl -nle'$r?/$r/&&print:/GO/?($r=qr/@{[join"|",@s]}/):push@s,$_'