【问题标题】:bash count occurrence of multiple words individually in a textfilebash 计算文本文件中单个单词的出现次数
【发布时间】:2017-01-26 17:37:54
【问题描述】:

基本上我需要这样做:

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

但这能更有效地完成吗?

【问题讨论】:

  • 您对 hek2mgl 的回答建议的编辑被拒绝;当你澄清你的问题时,它会更好地编辑 question

标签: bash grep word-count


【解决方案1】:

您可以使用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

【讨论】:

  • 准确地说,这是计算包含这些词的,而不是这些词的出现次数。但是,对于日志文件,这些日志级别的关键字通常每行出现一次。
  • @Kent 是的,这与问题中的代码相同。
  • 我认为 OP 也被单词出现和匹配行数弄糊涂了。
  • 也许 OP 确实对此感到困惑。
  • OP 不知道它会有所作为。
【解决方案2】:

使用@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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 2014-01-24
    • 1970-01-01
    • 2018-08-25
    • 2023-04-04
    相关资源
    最近更新 更多