ログファイルを繰り返し検索し、ログがない場合は「INVALID」を印刷します(bash)。

ログファイルを繰り返し検索し、ログがない場合は「INVALID」を印刷します(bash)。

〜750個のログディレクトリがあり、利用可能な最新のログファイルを検索する必要があります。

これはallLogs.txtファイルとしてキャプチャされ、各エントリにはワイルドカード "*"が含まれており、最新の日付のログのみがクロールされます(日付が異なり、同じ名前のログが多数ある場合があります)。

import_Asbeg_DA_Config3_*.log

import_test_deploy_*.log

import_Plus_DQ_Config1_*.log

たとえば、これは良くないことがわかりますが、目標を達成するためのループには非常に効果的です。

for LATEST in `cat allLogs.txt` ;
do
    find -name "${LATEST}" -type f | sort -n | tail -1

done < infile > outfile

すべてのディレクトリにログファイルがない可能性があるため、約350レコードを探します。

"allLogs.txt"には、このディレクトリのログファイルへの〜750のパスがすべて含まれています。

このコマンドをループで実行しているときにログファイルが見つからない場合でも、一貫性を維持する方法を見つけたいと思います。ログファイルを含まないレコードに「invalid」を追加することもできます。私はechoとfindコマンドの組み合わせを試しましたが、成功しませんでした。どんなアイデアがありますか?

ベストアンサー1

あなたの質問によると、あなたが実際に要求するのは、ディレクトリ内の最新のファイルを印刷することです(ディレクトリにファイルがある場合)。ディレクトリにファイルがない場合は、INVALID などの内容を印刷します。

上記の要約が正しい場合は、ループにif句を追加して、そのディレクトリを表示したときに1行しか出力されないことを確認できます。一行だけあればそれが目次です。したがって、文書はありません。その後、ループ内の他のコマンドをスキップしてリスト内の次の項目を続行できます。

更新されたスクリプトは次のとおりです。

#!/bin/bash

for LATEST in $(cat allLogs.txt); do
    if [[ $(find ${LATEST} -print | wc -l) -eq 1 ]]; then
        echo "${LATEST} has no files"
        continue
    fi
    find ${LATEST} -type f | sort -n | tail -1
done

exit 0

INVALIDを印刷するディレクトリがわからないので、INVALIDを印刷したくありません。

ループの標準入力をリダイレクトする理由が何であるかよくわかりません。 stdoutをリダイレクトしませんが、追加するのは簡単です。

おすすめ記事