我有一个自定义的 Nginx 访问日志,其中每一行都以 ISO8601 时间戳(在 Nginx 中)和纪元时间戳(在 Nginx 中)开头$time_iso8601
,精确到毫秒小数点。$msec
像这样:
2023-01-16T20:19:57+00:00 1673900397.009 ips="…" rm="…" […]
2023-01-16T20:19:57+00:00 1673900397.140 ips="…" rm="…" […]
2023-01-16T20:19:57+00:00 1673900397.163 ips="…" rm="…" […]
2023-01-16T20:19:57+00:00 1673900397.205 ips="…" rm="…" […]
2023-01-16T20:19:57+00:00 1673900397.210 ips="…" rm="…" […]
对于文件的每一行,从头开始,我想将行移动到(新的或现有的)文件,其中目标目的地是围绕 ISO8601 时间戳格式的年、月和日期构建的/yyyy/mm/dd/access.log
。例如,在上面的代码片段中,我希望将每一行从源移动access.log
到目标/2023/01/16/access.log
。
如果目标目录不存在,则应创建它。如果目标文件不存在,则应创建它。
您将使用什么工具来提取yyyy
、mm
和dd
值?
答案1
更好的使用logrotate
或nginx
配置,如αГsнιn 在评论中说
如果你想为了awk
好玩而实现这个:
awk -F'[-T]' '{
dir=$1"/"$2"/"$3
rc=system("mkdir -p " dir)
if (rc != 0) exit
print $0 >> dir"/access.log"
close(dir"/access.log")
}' access.log
# rm -f access.log
字段分隔符FS
F
设置为破折号和字符类。S
-F
-
T
输出目录/文件
$ find
./2023
./2023/01
./2023/01/16
./2023/01/16/access.log