将一行文本移动到(新的或现有的)文件,其中目标(子)目录由源文件确定

将一行文本移动到(新的或现有的)文件,其中目标(子)目录由源文件确定

我有一个自定义的 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

如果目标目录不存在,则应创建它。如果目标文件不存在,则应创建它。

您将使用什么工具来提取yyyymmdd值?

答案1

更好的使用logrotatenginx配置,如αГ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

相关内容