将 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 中秒数的输出执行操作(如果是其他情况)。

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

相关内容