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

--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는 숫자로 시작하지 않는 문자열을 0으로 처리합니다.

최종 결과는 값입니다.$6

답변2

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

관련 정보