문제

인사말,

내 스크립트가 Daily Log 파일에서 일부 점검을 수행 할 수 있도록 로그의 파일 이름을 변수에 저장해야합니다. 이 로그는 이름에 타임 스탬프가 있기 때문에 항상 다른 이름을 가지고 있습니다. 현재 LS 명령을 파쇄하는 Hodge Podged 메소드를 사용하고 있습니다.

CRON_LOG=$(ls -1 $LOGS_DIR/fetch_cron_{true,false}_$CRON_DATE*.log 2> /dev/null | sed 's/^[^0-9][^0-9]*\([0-9][0-9]*\).*/\1 &/' | sort -n | cut -d ' ' -f2- | tail -1 )

업데이트:

$ cron_date는 스크립트의 인수로 제공됩니다. 로그가 생성 된 날짜 (날)입니다. 때로는 여러 개의 로그가 같은 날에 존재하기 때문에 가장 최근의 로그를 얻기를 원합니다.

일부 일반적인 파일 이름 :
fetch_cron_false_031810090452.log
fetch_cron_true_031310090001.log
등...

이것이 그대로 작동한다는 것을 명심하십시오. 나는 그것이 추악하다고 생각하고 그것을 끌어내는 더 좋은 방법을 찾으려고 노력하고 있습니다.

나는 몇 달 전에 Google을 찾은 것들에서 이것을 함께 만들었을 것이라고 확신합니다. 지금은 작동하지만 기술에 정말 만족하지 않습니다. 나는 이것을 더 잘 수행하는 방법에 대한 몇 가지 아이디어를 가지고 있지만 이전 에이 사이트에서 큰 성공을 거두었으며 StackoverFlow 신을 먼저 언급하는 것이 가장 좋을 것이라고 생각했습니다. 모든 답변은 대단히 감사합니다.

고마워요, 라이언

도움이 되었습니까?

해결책

어때

CRON_LOG=$(ls -c $LOGS_DIR/fetch_cron_*$CRON_DATE* | head -1)

편집하다: 당신은 맞습니다. BTA, 나는 그것을 잡았어야 했어 결정된.

다른 팁

로그 파일을 구문 분석 한 후에는 처리되었음을 표시하여 변경되거나 다른 폴더로 이동하십시오. 이런 식으로 파일이 생성 된시기는 중요하지 않으며 아직 구문 분석되지 않았다는 것만 중요하지 않습니다.

또한보다 높은 수준의 스크립팅 언어를 사용하는 것이 좋습니다.

#!/bin/bash
shopt -s nullglob

last=
for file in "$LOGS_DIR"/fetch_cron_{false,true}_"$CRON_DATE"*.log
do
  last="$file"
done

if [ -n "$last" ]
then
  echo "$last"
else
  echo "No match found" >&2
  exit 1
fi

우선, 시도 :

FILELIST=`ls -1 $LOGS_DIR/fetch_cron_{true,false}_$CRON_DATE*.log`
CRON_LOG=`echo $FILELIST | tr -d [:alpha:][:punct:] | sort -n | tail -1`

그것은 제거됩니다 cut 그리고 거래합니다 sed 더 읽을 수있는 (IMO) 전화를위한 정규 표현 tr. 그것을 두 줄로 나누면 선명도에도 도움이됩니다.

다른 파일이없는 경우 $LOGS_DIR 극도로 유사한 파일 이름 (일반적으로 자체 폴더에 로그 로그를 유지하는 경우 발생)을 사용하면 매개 변수를 다음으로 바꿀 수 있습니다. ls 더 간단한 것 $LOGS_DIR/fetch_*_$CRON_DATE*.log. 단순성을 위해 필요한 파일 만 얻는 데 필요한 것보다 해당 라인을 더 복잡하게 만들지 마십시오.

연도를 앞에 접두사하여 날짜를 정렬 할 수있게 할 수 있습니다.

CRON_LOG=$(ls ${LOGS_DIR}/fetch_cron_{false,true}_${CRON_DATE}*.log| tail -1)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top