AIX에서 여러 작업의 최신 로그를 찾고 최신 로그를 삭제하는 방법

AIX에서 여러 작업의 최신 로그를 찾고 최신 로그를 삭제하는 방법

저는 유닉스를 처음 사용합니다. 여러 작업의 최신 로그를 찾고 최신 로그를 삭제하려고 합니다.

이에 대한 쉘 스크립트를 작성할 수 있습니까? 기본 명령을 사용해 보았지만 시간 범위를 선택하고 로그를 삭제하는 중이지만반품유용한 로그를 삭제하세요.


내가 발견한 내용을 공유합니다:

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 등이고 이러한 작업이 하루에 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. 일반적 으로 ls.​sortfind
  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. 이전에 이 직업과 날짜 조합의 실행을 본 적이 있다면 지금 보고 있는 실행이 지금까지 본 최고 실행보다 높습니까? 그렇다면 새 실행 번호를 기록하고 현재 파일을 삭제했을 수 있는 파일로 채웁니다. 동일한 작업 및 날짜에 대한 후속 로그가 이 항목을 덮어쓸 수 있으므로 작업 이름 및 날짜당 하나의 로그 파일만 삭제합니다.

rm마지막으로 삭제하려는 파일에 대한 예제 명령을 인쇄합니다 . 원하는 경우 주석을 달고 rm삭제를 위해 실제 명령 자체의 주석을 제거합니다.

관련 정보