我们正在尝试执行以下脚本,以查找日志文件中特定单词的出现 需要建议来优化脚本。
测试日志大小 - 大约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
答案 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
个键
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,$_'