我们有一个错误日志目录结构,其中我们将特定日期的所有错误日志文件存储在日期目录中 -
errorbackup/20150629/errorlogFile3453123.log.xml
errorbackup/20150629/errorlogFile5676934.log.xml
errorbackup/20150629/errorlogFile9812387.log.xml
errorbackup/20150628/errorlogFile1097172.log.xml
errorbackup/20150628/errorlogFile1908071_log.xml
errorbackup/20150627/errorlogFile5675733.log.xml
errorbackup/20150627/errorlogFile9452344.log.xml
errorbackup/20150626/errorlogFile6363446.log.xml
我想在错误日志文件中搜索特定字符串并获取输出,以便我将获得该字符串出现次数的目录明智搜索结果。例如grep" blahblahSQLError"应输出类似 -
的内容20150629:0
20150628:0
20150627:1
20150626:1
这是必需的,因为我们修复了其中一个版本中的一些错误,并且我希望确保从部署到Prod的那天起不会发生该错误。另请注意,每天都会创建数千个错误日志文件。每个错误日志文件的名称都使用随机数创建,以确保唯一性。
答案 0 :(得分:0)
如果您确定日志文件的文件名不包含任何“奇数”字符或换行符,则以下内容应该有效。
for dir in errorbackup/*; do
printf '%s:%s\n' "${dir#*/}" "$(grep -l blahblahSQLError "$dir/"*.xml | wc -l)"
done
如果他们可以有意想不到的名字,那么您需要使用多次调用grep
并手动计算匹配的文件。这样的事情。
for dir in errorbackup/*; do
_dcount=0;
for log in "$dir"/*.xml; do
grep -l blahblahSQLError "$log" && _dcount=$((_dcount + 1));
done
done
答案 1 :(得分:0)
这样的事情应该这样做:
for dir in errorbackup/*
do
awk -v dir="${dir##*/}" -v OFS=':' '/blahblahSQLError/{c++} END{print dir, c+0}' "$dir"/*
done
使用find
和xargs
可能有一种可行的方法来避免循环,你当然可以在一个awk
命令中完成所有操作但生命太短......