我想把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运维技术,转载本站内容,请注明内容出处”来源刘国华教育“。如若本站内容侵犯了原著者的合法权益,请联系我们进行处理。