Bashからファイル名の他のフィールドを抽出するには?

Bashからファイル名の他のフィールドを抽出するには?

マージしたいログファイルがいくつかあります。ファイル名の形式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.logpublic.error-2021-15.log

異なるサーバーに同じ種類のファイルがある可能性があるため、パブリック、プライベート、およびパラサーバーのプライマリファイルを別々に融合し、エラーファイルとセカンダリファイルに対しても同じことを行う必要があります。ファイルは特定の日付範囲内で均等にマージする必要があります(毎月7日ごとに1ファイルずつマージ)。

私のアプローチは、次の条件を使用することです。

  1. サーバー名(public、private、para)をファイル名と比較して、そのサーバーに従ってファイルをグループ化します。
  2. ファイル名にあるファイル形式(エラー、メジャー、マイナー)を比較し、各サーバーでその形式のファイルのみを融合します。
  3. 日付範囲を比較します(融合ファイルを受け取るには月に最大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}' {} +;)を使用しますが、注意すべきいくつかの問題があります。

おすすめ記事