로그 파일을 반복적으로 검색하고 로그가 없으면 "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 절을 추가하여 해당 디렉터리를 볼 때 한 줄만 출력되는지 확인할 수 있습니다. 한 줄만 있으면 그것이 목차입니다. 따라서 문서가 없습니다. 그런 다음 루프의 다른 명령을 건너뛰고 목록의 다음 항목을 계속할 수 있습니다.

업데이트된 스크립트는 다음과 같습니다.

#!/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을 리디렉션하지는 않지만 추가하기 쉽습니다.

답변2

에서와 같이이미 가지고 있는 답변, 나는 당신이 많은 디렉토리를 가지고 있다고 가정합니다. 각 디렉토리에는 이름이 공통 부분과 정렬용 숫자로 구성된 0개 이상의 파일이 포함되어 있고 이러한 이름의 공통 부분이 파일에 나열되어 있다고 가정합니다 allLogs.txt.

다음과 같은 방법을 사용하여 일치하는 항목이 없는 각 이름에 대한 행을 추가할 수 있습니다 outfile.allLogs.txtfind

#!/bin/bash

while read -r LATEST; do
  find -name "${LATEST}" -type f | tee >( [ "$(wc -l)" = 0 ] && printf '%s\n' "${LATEST} INVALID" )  | sort -n | tail -1
done < allLogs.txt > outfile

teefind아무것도 발견되지 않더라도 프로세스 교체가 수행되며, 이 경우 메시지가 인쇄됩니다.

공백이 포함된 파일 이름을 관리할 수 있도록 for loopa 로 변경했습니다 . while loop그에 따라 입력 리디렉션이 변경되지만 원하는 결과가 아닐 수도 있습니다. 어쨌든 이는 귀하의 주요 질문("잘못된" 알림을 추가하는 방법)과는 아무런 관련이 없습니다.

답변3

도움을 주신 모든 분들께 진심으로 감사드립니다!

"printf"는 내 친구예요!

이 코드는 내 원래 문제를 해결했습니다... outfile은 ~750줄의 무결성을 유지합니다... outfile은 약간 지저분하지만 awk, sed 등으로 처리할 수 없는 것은 없습니다.

 for LATEST in `cat ${TMPDIR}/AllLogs.txt` ;
    do
      printf "`echo ${LATEST}` `find -name "${LATEST}" -type f | sort -n | tail -1`\n"

    done < infile > outfile

관련 정보