Bash 스크립트를 AWK 스크립트로 변환

Bash 스크립트를 AWK 스크립트로 변환
CURTIME=$(date '+%s')
LOG=/home/apache_logs.txt
FILETIME1=$(stat $LOG -c %Y)
TIMEDIFF1=$(expr $CURTIME - $FILETIME1)

Ubuntu에서 이 스크립트를 만들었고 그곳에서는 제대로 작동하지만 SunOS(Generic_150400-64 sun4v sparc sun4v)에서는 작동하지 않습니다.

이 스크립트는 로그가 업데이트되고 있는지 확인하고 그렇지 않은 경우 TIMEDIFF1의 초 단위 출력을 기반으로 조치를 취합니다.

만약 else가 이와 같은 일을 한다면, 로그가 15분 전에 업데이트되었다면 이렇게 하고, 30분 전에 업데이트되었다면 이렇게 하십시오... 등등.

따라서 if else 문의 효율적인 작업을 위해서는 초 단위의 출력 시간이 매우 중요합니다.

그래서 파일의 수명(수정/업데이트된 지 얼마나 됐는지)을 초 단위로 확인하려고 합니다. 몇 초가 필요해요.

답변1

stat 대신 다음 Perl oneliner를 사용할 수 있습니다.

perl -e 'print((stat("/tmp/a"))[10])'

현재 날짜 문제를 해결하려면 touch다음과 같은 명령을 사용하여 임시 파일을 만들고 임시 파일에서 수정 타임스탬프를 읽을 수 있습니다.

touch /tmp/currtime
CURRTIME=$(perl -e 'print((stat("/tmp/currtime"))[10])')
FILETIME=$(perl -e 'print((stat("/path/to/log"))[10])')
DIFFTIME=$(($CURRTIME - $FILETIME))
echo "Time difference is $DIFFTIME seconds"
#cleanup
rm /tmp/currtime

perl stat() 명령에 대한 참조는 다음에서 찾을 수 있습니다.https://perldoc.perl.org/functions/stat.html

답변2

SunOS 시스템의 버전이 date이 매개변수를 지원하지 않는  경우 +%s다음을 사용하여 awk수정하십시오 .저것불가능하지는 않지만 비실용적입니다.

효과적인가요? 그렇지 않다면 운이 좋지 않은 것입니다. 그렇다면 다음을 사용하여 현재 시간을 얻을 수 있습니다.stat filename -c %Y

tmpfile="/tmp/apache_test$$"
if [ -e "$tmpfile" ]
then
    printf "%s exists; that’s odd.\n" "$tmpfile"
    exit
fi
if ! { touch "$tmpfile"  &&  CURTIME=$(stat "$tmpfile" -c %Y)  &&  rm "$tmpfile";}
then
    printf "Something went wrong.\n"
    exit
fi

귀하의 bash 버전이 이를 지원하지 않으면 대신 사용하십시오.[ -e filename ]-f

PS 모든 변수를 인용해야 합니다.

FILETIME1=$(stat "$LOG" -c %Y)
TIMEDIFF1=$(expr "$CURTIME" – "$FILETIME1")

관련 정보