如何在awk if条件下执行算术运算

如何在awk if条件下执行算术运算

我正在检查目录中存在的特定文件是否早于 30 分钟。

curr_epch=`date +%s`
curr_epch_buff=`expr $curr_epch - 1800`


ls -l --time-style=+"%s" | grep .part |  awk '{ if (($6 >= $curr_epch_buff)) print $6 }'

然而,无论提到的条件如何,上面的代码都会给我结果。

为了调试它,当我尝试计算这两个值之间的差异时,我也没有得到预期的结果,而是得到了6 美元正在打印,因为它是:

ls -l --time-style=+"%s" | grep .part |  awk '{ print (expr $6 - $curr_epch_buff) }'

但是,如果我尝试使用上面的查询减去静态数字,它会给我预期的结果:

ls -l --time-style=+"%s" | grep .part |  awk '{ print (expr $6 - 200) }'

有人可以告诉我上面提到的第一组和第二组代码有什么问题吗?

答案1

使用$(...)而不是`...`--参见 https://mywiki.wooledge.org/BashFAQ/082
bash 可以做算术,你不需要调用expr.
不解析ls

curr_epch_buff=$( date -d '30 minutes ago' +%s )

for file in *.part; do
    file_mtime=$( stat -c '%Y' "$file" )
    if (( file_mtime < curr_epch_buff )); then
        echo "$file is older than 30 minutes"
    fi
done

存在的问题awk '{ print (expr $6 - $curr_epch_buff) }'

  • curr_epch_buff被视为awk 变量。它未设置。
  • 在 awk 中,$n它的作用就像一个运算符,返回由引用的字段号的内容n
  • 在数字上下文中,未设置的变量被视为数字 0
  • so与整个记录$curr_epch_buff相同。$0
  • expr也是一个未设置的变量
  • expr $6是字符串连接,结果是内容$6
  • $6 - $0
    • 该记录不是以数字开头,而是以返回的文件权限字符串开头ls -l
    • awk 将不以数字开头的字符串视为零

最终的结果就是值$6

答案2

if [ -z "$(find . -name '*.part' -mmin -30)" ]
then
   echo ".part file is old"
else
   echo ".part file is recent"
fir

相关内容