首先,我们需要创建一个名为split_nginx_logs.sh
的shell脚本。在这个脚本中,我们将实现以下功能:
- 接收用户输入的日志文件路径和分割后的日志文件路径。
- 使用
awk
命令提取日志文件中的日期和时间信息。 - 根据日期和时间信息,将日志文件分割成多个文件。
- 为每个分割后的文件添加一个序号作为文件名。
- 删除原始日志文件。
- 将分割后的日志文件压缩成一个zip文件。
下面是split_nginx_logs.sh
脚本的内容:
#!/bin/bash
# 检查参数数量
if [ "$#" -ne 2 ]; then
echo "Usage: $0 <input_log_file> <output_dir>"
exit 1
fi
# 获取输入日志文件路径和输出目录路径
input_log_file="$1"
output_dir="$2"
# 检查输入日志文件是否存在
if [ ! -f "$input_log_file" ]; then
echo "Error: input log file does not exist."
exit 1
fi
# 检查输出目录是否存在,如果不存在则创建
if [ ! -d "$output_dir" ]; then
mkdir -p "$output_dir"
fi
# 使用awk命令提取日志文件中的日期和时间信息,并根据日期和时间信息分割日志文件
awk 'BEGIN { OFS = "[%d/%b/%Y:%H:%M:%S]" } { print > "'${output_dir}/nginx-'${1}'-'$2}'.log" }' "$input_log_file" | sort | uniq -c | while read line; do
# 为每个分割后的文件添加一个序号作为文件名
output_file="${output_dir}/nginx-${line}-$(date +%s).log"
date -d @$(echo "$line * 86400 + $(echo "$line % 86400" | cut -d ':' -f 2)" | tr -d '[:space:]') +"%d/%b/%Y:%H:%M:%S" > "$output_file" || true
done
# 删除原始日志文件
rm "$input_log_file" || true
# 将分割后的日志文件压缩成一个zip文件
cd "$output_dir" && zip -r "nginx-logs.zip" ./* || true
使用方法:
- 将上述脚本内容保存为
split_nginx_logs.sh
文件。 - 赋予脚本执行权限:
chmod +x split_nginx_logs.sh
。 - 运行脚本,传入输入日志文件路径和输出目录路径:
./split_nginx_logs.sh /path/to/input.log /path/to/output
。