bash 统计文本文件中多个单词的出现次数

bash count occurrence of multiple words individually in a textfile

基本上我需要这样做:

LOGFILE=error.log

echo $LOGFILE
echo -e "\tERRORs: $(grep -e "ERROR" -c $LOGFILE)"
echo -e "\tDEBUGs: $(grep -e "DEBUG" -c $LOGFILE)"
echo -e "\tFATALs: $(grep -e "FATAL" -c $LOGFILE)"

结果:

error.log
    ERRORs: 3
    DEBUGs: 12
    FATALs: 0

但这可以更有效地完成吗?

您可以使用 awk。以下脚本在单个 运行:

中处理文件
# count.awk

/Error/{e++}
/DEBUG/{d++}
/FATAL/{f++}

END {
   printf "Errors: %s\n", e
   printf "Debug: %s\n", d
   printf "Fatal: %s\n", f
}

运行 喜欢:

awk -f count.awk input.file

使用@hek2mgl 的回答,我得到了这个解决方案:

basedir="/path/to/logs"
basedirs_arr=(
/dir1/logs
/dir2/logs
/dir3/logs
/etc/logs
)
summary(){
    for i in "${!basedirs_arr[@]}"
    do
        if [ -d "${basedir}${basedirs_arr[$i]}" ]; then
            find ${basedir}${basedirs_arr[$i]} -type f -iname "*.log" | xargs -I{} sh -c "echo test2 {} ;awk '
BEGIN{
e=0;
d=0;
f=0;
}
/ERROR/{e++}
/DEBUG/{d++}
/FATAL/{f++}
END {
   printf \"\tErrors: %s\n\", e
   printf \"\tDebug: %s\n\", d
   printf \"\tFatal: %s\n\", f
}' {}"
#        else
            # If directory doesn't exist.
            # echo -e "\e[31mdirectory doesn't exist: ${basedir}${basedirs_arr[$i]}\e[0m"
        fi
    done
}