
マージしたいログファイルがいくつかあります。ファイル名の形式environment.type-YYYY-MM-DD.log
は次のとおりです。
environment
サーバーの環境を表します:「private」、「public」、「para」など)type
「主」、「マイナー」、「エラー」などです。YYYY-MM-DD
ファイル作成日を示します。
すべてのファイルタイプはすべてのサーバーで見つかります。 「プライマリ」、「パート」、および「エラー」ファイルは、プライベート、パブリック、および準サーバーにあります。private.error-2021-09-10.log
, , , public.error-2021-09-11.log
.public.primary-2021-09-08.log
public.error-2021-15.log
異なるサーバーに同じ種類のファイルがある可能性があるため、パブリック、プライベート、およびパラサーバーのプライマリファイルを別々に融合し、エラーファイルとセカンダリファイルに対しても同じことを行う必要があります。ファイルは特定の日付範囲内で均等にマージする必要があります(毎月7日ごとに1ファイルずつマージ)。
私のアプローチは、次の条件を使用することです。
- サーバー名(public、private、para)をファイル名と比較して、そのサーバーに従ってファイルをグループ化します。
- ファイル名にあるファイル形式(エラー、メジャー、マイナー)を比較し、各サーバーでその形式のファイルのみを融合します。
- 日付範囲を比較します(融合ファイルを受け取るには月に最大7日間)。
これを行うには、条件に含める値と比較するサーバー名、ファイルの種類、日付を抽出し、上記の方法で説明したようにファイルを個別に融合するためのいくつかのコマンドが必要です。
私は以下を試してみました。*.log | awk -F'[_.]' '{print $1}'
環境抽出(フィールド1)部分を使用して*.log | awk -F'[_.]' '{print $2}'
ファイル形式(フィールド2)を抽出しようとしましたが、機能しませんでした。
答え1
サンプルファイル名セットを使用して:
private.error-2021-09-10.log
public.error-2021-09-11.log
public.primary-2021-09-08.log
public.error-2021-15.log
最後のファイル名に欠落している「-MM-」部分が誤字のようです。
以下は、あなたに適したawkを使用する例です。
「環境」を得なさい:
ls *.log | awk -F'[.-]' '{print $1}'
結果:
private
public
public
public
「タイプ」のインポート:
ls *.log | awk -F'[.-]' '{print $2}'
結果:
error
error
error
primary
日付スタンプを入手する:
ls *.log | awk -F'[.-]' '{print $3 "-" $4 "-" $5}'
結果:
2021-09-10
2021-09-11
2021-15-log
2021-09-08
編集する:
以下の説明では、出力を解析しないオプションを追加したいと思います。ls
これは、他の問題が発生しやすいためです。
次のことを試すことができます。
for file in *.log; do
echo "$file" | awk -F'[.-]' '{print $1}'
echo "$file" | awk -F'[.-]' '{print $2}'
echo "$file" | awk -F'[.-]' '{print $3 "-" $4 "-" $5}'
done
またはfind(find -type f -name "*.log" -exec awk -f'[.-]' '{print $1}' {} +;
)を使用しますが、注意すべきいくつかの問題があります。
答え2
ログファイルがすべてファイル名のワイルドカードパターンと一致すると仮定すると、その名前を*.*-*.log
繰り返して複数の部分を別々の変数に抽出できます。
for name in *.*-*.log; do
tmpname=$name
environment=${tmpname%%.*}; tmpname=${tmpname#*.}
type=${tmpname%%-*}; tmpname=${tmpname#*-}
date=${tmpname%.log}
printf '"%s" --> %s + %s + %s\n' \
"$name" "$type" "$environment" "$date"
done
このコードは、名前のさまざまな部分を3つの変数で抽出しますenvironment
。私たちは、連続した手順を使用して名前のコピーから各部分を抽出して削除します。我々は何度も使用するよりも速い標準パラメータ置換を使用しています。type
date
tmpname
awk
次の例を実行してください。
$ ls
list public.error-2021-15.log
private.error-2021-09-10.log public.primary-2021-09-08.log
public.error-2021-09-11.log script
$ ./script
"private.error-2021-09-10.log" --> error + private + 2021-09-10
"public.error-2021-09-11.log" --> error + public + 2021-09-11
"public.error-2021-15.log" --> error + public + 2021-15
"public.primary-2021-09-08.log" --> primary + public + 2021-09-08