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 }'

ただし、上記のコードは、言及された条件に関係なく結果を提供します。

デバッグするためにこれら2つの値の差を計算しようとすると、期待した結果が得られず、代わりに次の結果が表示されます。$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) }'

上記の最初と2番目のコードセットにどのような問題があるのか​​教えてください。

答え1

--see $(...)の代わりに`...`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

関連情報