同じ日付のすべてのログファイルをインポートして新しいログを作成するには?

同じ日付のすべてのログファイルをインポートして新しいログを作成するには?
TMW_yyyymm=`date +%Y%m --date='tomorrow'`
YDY_yyyymmdd=`date +%Y%m%d --date='yesterday'`
YDY_yyyymm=`date +%Y%m --date='yesterday'`
TODAY=`date +'%Y%m%d'`

SRC_LOG="/home/user/bin/abc.log.${YDY_yyyymmdd}"
HOMEDIR="/home/user/bin"
DEST="/log/user/abc"

上記は以前の同僚から受け取った以前のスクリプトの一部であり、次のように変更する必要がありました。

SRC_LOGには、abc.log.[yyyymmdd].[0-n]形式の複数のログファイルがあります。

例えば

 abc.log.20230221.0
 abc.log.20230221.1
 abc.log.20230221.2

ちょっと待って、一日にどれだけのログファイルが生成されるのかわかりません。

"SRC_LOG"ディレクトリを繰り返して同じ日のすべてのログファイルをインポートし、その日のすべてのログファイルを新しいログファイルにマージするようにスクリプトを変更したいと思います。

問題は、私がbashスクリプトに慣れておらず、毎日必要なファイルを抽出する方法、つまりサフィックス.0 .1 .2 ...などを繰り返す方法がわからないことです。

助けてくれてありがとう。ありがとうございます!

答え1

私は何をしますか:

今日:

 d=$(date +%Y%m%d)
 find ./dir -name "abc.log.${d}.[0-9]*" -exec cat {} + > "${d}.log'
 #rm ./dir/abc.log.${d}.*

他の日付に適応

答え2

次のログファイルがある場合特定の日付$SRC_LOGディレクトリから:

printf '%s\n' "$SRC_LOG"/abc.log.* | sort -V | xargs cat > "/path/to/${SRC_LOG##*/}"
  • sort -V.0前にサフィックスが揃っていることを確認してください。.10
  • ${SRC_LOG##*/}結合ログの新しいファイル名でパスからディレクトリコンポーネントを削除します。

必要に応じてターゲットディレクトリを変更します。


次のログファイルがある場合様々な日付$SRC_LOGディレクトリから:

cd "$SRC_LOG"
printf '%s\n' abc.log.* | cut -d. -f-3 | sort -u |
    xargs -I{} sh -c 'printf "%s\n" "$1".* | sort -V |
        xargs cat > "/path/to/$1"' sh '{}'

すべてのログファイルのファイル名を印刷し、サフィックス部分を削除して一意に並べ替えて、サフィックスなしですべてのログファイル名を取得します。

その後、結果がに渡されますxargs。各引数に対して、サフィックスを含むログファイル名を印刷するスクリプトを起動し、結果とcatそれらのファイルを出力ファイルにソートします。


GNUツールを使用して、タブまたは改行文字を含むファイル名のより安全なNULL終了バージョンは次のとおりです。

printf '%s\0' "$SRC_LOG"/*.log.* | sort -zV | xargs -0 cat > "/path/to/${SRC_LOG##*/}"

そして

printf '%s\0' *.log.* | cut -zd. -f-3 | sort -zu |
    xargs -0I{} sh -c 'printf "%s\0" "$1".* | sort -zV |
        xargs -0 cat > "/path/to/$1"' sh '{}'

関連情報