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
}
基本上我需要这样做:
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
}