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")

関連情報