AIXで複数のジョブの最新ログを見つけて最新のログを削除する方法

AIXで複数のジョブの最新ログを見つけて最新のログを削除する方法

私はUnixを初めて使用します。複数のジョブの最新ログを見つけて、最新のログを削除しようとしています。

これに対するシェルスクリプトを書くことはできますか?デフォルトのコマンドを試しましたが、時間範囲を選択してログを削除していますが、返品便利なログを削除してください。


私が見つけたものを共有します。

touch -t 201903281325.00 start           
touch -t 201903281331.00 stop                 
find . -newer start \! -newer stop -type f \( -name "**" -o -name "**" \) -exec rm -f {} \;

その時間内にすべてのファイルが削除されます。


私がしたいこと:

ジョブ名がA、B、Cなどで、これらのジョブが1日5回実行されるとします(例:A_1、A_2、A_3、B_1、B_2、B_3など)。

今日生成されたランニングログについて話してください。

Order_created_20190611_1.log
Order_created_20190611_2.log 
Order_created_20190611_3.log
Order_zip_rec_20190611_1.log
Order_zip_rec_20190611_2.log

自動的に削除する必要がある項目:

Order_created_20190611_3.log
Order_zip_rec_20190611_2.log

自動的に見つけて削除しOrder_created_20190611_3.logたいです。Order_zip_rec_20190611_2.log

役職の例:

  • Order_created- 役職
  • 20190611- 実行日
  • _2(最後の言及) - 実行回数。_2今日のランニングは二度目という意味だ。

答え1

このような単純なファイル名の場合、改行文字などの奇妙な文字は含まれていないため、解析できますls(通常は。推奨しない.)

あなたの質問で説明されているように、私たちはこれらのパターンと一致するファイルを処理すると仮定します。もちろん*「すべて」が一致します。

Order_created_20190611_*.log
Order_zip_rec_20190611_*.log

また、今日の日付に基づくファイルの場合は、次のような「最新」ファイルを見つけることができます。

# Today's date in YYYYMMDD format
today="$(date +%Y%m%d)"

# Get "ls" to give us the files ordered by date modified (newest first). Pick off the first
newest="$(ls -t "Order_created_${today}_"*".log" | head -n1)"

# Show what we would delete (remove "echo" to action)
echo rm "$newest"

この原則を使用すると、複数のファイル名にわたってループにロールアップできます。

today="$(date +%Y%m%d)"
for prefix in Order_created Order_zip_rec
do
    newest="$(ls -t "${prefix}_${today}_"*".log" 2>/dev/null | head -n1)"
    [[ -f "$newest" ]] && echo rm "$newest"
done

ガイドライン

  1. 一般的にlssortfind
  2. ls一致するファイルがない場合は、エラー出力を放棄しました。
  3. rm今回も削除するファイルがある場合にのみ試しました。

答え2

各タスクと日付グループの「最後」(最も高い番号の「実行」)ログファイルを削除するには、各組み合わせで表示される親タスクの実行を追跡し、削除するタスクを一覧表示するksh93ベースのソリューションを使用することをお勧めします。ファイル数:

#!/bin/ksh93

typeset -A highestjobruns=()
typeset -A deletions=()

for logfile in *_????????_*.log
do
  base=${logfile%.log}
  run=${base##*_}
  jobdate=${base%_?}
  if [ -z "${highestjobruns[$jobdate]}" ]
  then
        # no job runs found yet, this is it; nothing to delete yet
        highestjobruns[$jobdate]=$run
  else
        # if this file has a higher run number, it's the new target for deletion
        if [ "$run" -gt "${highestjobruns[$jobdate]}" ]
        then
                highestjobruns[$jobdate]=$run
                deletions[$jobdate]=$logfile
        fi
  fi
done
printf 'Would rm: %s\n' "${deletions[@]}"
#rm -- "${deletions[@]}"

デフォルトのアイデアは、各潜在的なログファイルを繰り返し(好みに応じてワイルドカードを調整します。「何でも」、下線、6桁、下線、「何でも」、で終わる必要があります)、.log実行番号とタスクの組み合わせと日付選択してから、いくつかの質問をしてください:

  1. このタスクの実行と日付の組み合わせを記録しましたか?そうでない場合は、それを文書化して続行してください。これは、シングルトンジョブの実行を削除しないことを意味します。
  2. 以前にこのジョブと日付の組み合わせの実行を見たことがある場合は、今見ている実行がこれまでに見た最高の実行よりも高いのでしょうか。その場合は、新しい実行番号を記録し、現在のファイルを削除した可能性があるファイルでいっぱいにします。同じジョブと日付の後続のログはこのエントリを上書きする可能性があるため、ジョブ名と日付ごとに1つのログファイルのみを削除します。

rm最後に、削除したいファイルのサンプルコマンドを印刷します。必要に応じてコメントを付け、rm削除のために実際のコマンド自体のコメントを削除します。

関連情報