搜索字符串出现并显示目录明智的计数

时间:2015-06-29 19:10:14

标签: grep

我们有一个错误日志目录结构,其中我们将特定日期的所有错误日志文件存储在日期目录中 -

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的那天起不会发生该错误。另请注意,每天都会创建数千个错误日志文件。每个错误日志文件的名称都使用随机数创建,以确保唯一性。

2 个答案:

答案 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

使用findxargs可能有一种可行的方法来避免循环,你当然可以在一个awk命令中完成所有操作但生命太短......