テキスト 1 行を (新規または既存の) ファイルに移動します。ここで、ターゲット(サブ)ディレクトリはソースファイルによって決定されます。

テキスト 1 行を (新規または既存の) ファイルに移動します。ここで、ターゲット(サブ)ディレクトリはソースファイルによって決定されます。

各行がISO8601タイムスタンプ(Nginx)とエポックタイムスタンプ(Nginx)で始まり、$time_iso8601最も近いミリ秒まで表示されるカスタムNginxアクセスログがあります。$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。たとえば、上記のコードスニペットでは、各行をsourceからaccess.logtargetに移動したいとします/2023/01/16/access.log

ターゲットディレクトリが存在しない場合は、新規作成する必要があります。ターゲットファイルがない場合は作成する必要があります。

yyyymmおよび値を抽出するにはどのツールを使用しますかdd

ベストアンサー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

おすすめ記事