我想把nginx的日志分日期生成一个个文件。如果用手工的话,大概就是这样子的操作。

grep '24/Mar/2025' www.liuguohua.com.log > www.liuguohua.com.2025-3-24.log

一天需要执行一次以上命令,并且要手工修改日期后,再次执行,一年365天,就要调整近365次,手工执行365次。

手上执行,效率肯定慢,于是想到shell脚本,手工写shell,肯定需要调试,也需要一定时间,于是搬出deepseek,让ai写。

打开deepsee官网,https://www.deepseek.com/。

输入我的要求:

帮我写一个shell脚本,要求如下:
1、数据文件为nginx的日志
2、以天为单位,利用grep过滤nginx的日志文件,生成以日期为命名的文件

deepseek马上就根据我的要求,输出一个shell脚本,内容如下:

#!/bin/bash

# 定义日志文件路径
LOG_FILE="/var/log/nginx/access.log" # 请根据实际路径修改
OUTPUT_DIR="./output" # 输出目录,可根据需要修改

# 创建输出目录
mkdir -p "$OUTPUT_DIR"

# 获取日志中所有的唯一日期(假设日志格式包含 [dd/MMM/YYYY:HH:MM:SS])
DATES=$(grep -o '\[[0-9][0-9]/[A-Za-z][A-Za-z][A-Za-z]/[0-9][0-9][0-9][0-9]' "$LOG_FILE" | sort | uniq | sed 's/\[//g')

# 遍历每个日期并过滤日志
for DATE in $DATES; do
# 将日期格式从 01/Jan/2023 转换为 01-Jan-2023 用于文件名
FILE_DATE=$(echo "$DATE" | sed 's/\//-/g')
OUTPUT_FILE="$OUTPUT_DIR/nginx_log_$FILE_DATE.log"

# 过滤该日期的日志
grep "$DATE" "$LOG_FILE" > "$OUTPUT_FILE"

echo "已生成: $OUTPUT_FILE"
done

echo "处理完成!所有日志已按日期分割到 $OUTPUT_DIR 目录"

把上面的脚本,修改下LOG_FILE与OUTPUT_DIR参数,把生产的文件名前缀nginx_log_字符也去掉,执行这个脚本,确实批量产生了以日期为单位的日志文件。

-rw-r--r-- 1 root root 1814004 Mar 26 08:39 2025-Mar-05.log
-rw-r--r-- 1 root root 1545367 Mar 26 08:39 2025-Mar-06.log
-rw-r--r-- 1 root root 2071448 Mar 26 08:39 2025-Mar-07.log
-rw-r--r-- 1 root root 2627811 Mar 26 08:39 2025-Mar-08.log
-rw-r--r-- 1 root root 1733987 Mar 26 08:39 2025-Mar-09.log
-rw-r--r-- 1 root root 1911825 Mar 26 08:39 2025-Mar-10.log
-rw-r--r-- 1 root root 1691025 Mar 26 08:39 2025-Mar-11.log
-rw-r--r-- 1 root root 2400498 Mar 26 08:39 2025-Mar-12.log

但日期格式不是我们可以一眼理解的数字月份,于是又增加了对deepseek的要求,整个要求如下:

帮我写一个shell脚本,要求如下: 
1、数据文件为nginx的日志 
2、以天为单位,利用grep过滤nginx的日志文件,生成以日期为命名的文件 
3、日期格式类似为2025-01-18

deepseek根据我的要求,生成了,如下脚本,我继续修改了日志文件路径及输出目录。

#!/bin/bash

# Nginx日志处理脚本
# 功能:按日期分割日志文件,生成 YYYY-MM-DD 格式的日志文件

# 配置部分
NGINX_LOG="/var/log/nginx/access.log" # Nginx日志路径
OUTPUT_DIR="./nginx_logs_by_day" # 输出目录
DATE_FORMAT="%d/%b/%Y" # 日志中的日期格式(如18/Jan/2025)

# 创建输出目录
mkdir -p "$OUTPUT_DIR"

# 月份转换函数:将英文月份缩写转换为数字
month_to_num() {
case $1 in
Jan) echo "01";; Feb) echo "02";; Mar) echo "03";;
Apr) echo "04";; May) echo "05";; Jun) echo "06";;
Jul) echo "07";; Aug) echo "08";; Sep) echo "09";;
Oct) echo "10";; Nov) echo "11";; Dec) echo "12";;
*) echo "00";; # 异常情况
esac
}

# 从日志中提取所有唯一日期
extract_dates() {
grep -o "\[[0-9]\{2\}/[A-Za-z]\{3\}/[0-9]\{4\}" "$NGINX_LOG" | \
sed 's/\[//g' | \
sort | \
uniq
}

# 主处理函数
process_logs() {
echo "开始处理Nginx日志..."
echo "源日志文件: $NGINX_LOG"
echo "输出目录: $OUTPUT_DIR"
echo ""

# 获取所有日期
DATES=$(extract_dates)

for DATE in $DATES; do
# 解析日期
DAY=$(echo "$DATE" | cut -d'/' -f1)
MONTH_ABBR=$(echo "$DATE" | cut -d'/' -f2)
YEAR=$(echo "$DATE" | cut -d'/' -f3)

# 转换月份
MONTH_NUM=$(month_to_num "$MONTH_ABBR")

# 格式化日期为 YYYY-MM-DD
FORMATTED_DATE="${YEAR}-${MONTH_NUM}-${DAY}"

# 输出文件名
OUTPUT_FILE="${OUTPUT_DIR}/nginx_${FORMATTED_DATE}.log"

# 过滤当天的日志
echo "正在处理 $FORMATTED_DATE 的日志..."
grep "\[${DAY}/${MONTH_ABBR}/${YEAR}" "$NGINX_LOG" > "$OUTPUT_FILE"

# 统计行数
LINE_COUNT=$(wc -l < "$OUTPUT_FILE")
echo "生成文件: $OUTPUT_FILE (${LINE_COUNT} 行)"
done

echo ""
echo "日志处理完成!"
echo "共生成 $(echo "$DATES" | wc -l) 个日期日志文件"
}

# 执行主函数
process_logs

执行修改完的脚本,最终结果如下:

-rw-r--r-- 1 root root 6130064 Mar 26 08:29 2025-03-19.log
-rw-r--r-- 1 root root 8410983 Mar 26 08:29 2025-03-20.log
-rw-r--r-- 1 root root 4322202 Mar 26 08:29 2025-03-21.log
-rw-r--r-- 1 root root 1673027 Mar 26 08:29 2025-03-22.log
-rw-r--r-- 1 root root 2263920 Mar 26 08:29 2025-03-23.log
-rw-r--r-- 1 root root 1624467 Mar 26 08:29 2025-03-24.log
-rw-r--r-- 1 root root 1522808 Mar 26 08:29 2025-03-25.log
-rw-r--r-- 1 root root 542764 Mar 26 08:29 2025-03-26.log

确实完美。

合理利用deepseek这些AI大模型,确实给工作带来了极大的效率提升。

 

 

 

声明:欢迎大家光临本站,学习IT运维技术,转载本站内容,请注明内容出处”来源刘国华教育“。如若本站内容侵犯了原著者的合法权益,请联系我们进行处理。