행에서 날짜를 선택하고 현재 날짜와 비교하여 선택한 행과 다른 필드를 인쇄합니다.

행에서 날짜를 선택하고 현재 날짜와 비교하여 선택한 행과 다른 필드를 인쇄합니다.

if-then현재 날짜와 비교되는 행에서 날짜를 가져오는 명령이 있고 명령문의 동일한 행에서 다른 필드를 인쇄 하고 싶습니다 .

cat /tmp/OutPrint |cut -d' ' -f 2 | while IFS= read line; do
    
    now=$(date | cut -d' ' -f 4)
    
    time_now=$(date -u -d "$now" +"%s")   #seconds
    time_line=$(date -u -d "$line" +"%s") #seconds
    
    difference=$(echo $((time_now - time_line)))
    
    if [ $difference -ge 2592000 ] 
    then
        echo "Time difference is greater than 30 days"
    else 
        echo "Time difference is less than 30 days"
    fi
done

아래는 내 파일의 내용이며 파일의 날짜를 현재 날짜와 비교하고 있습니다. 차이가 30일 이상인 경우 then보고서의 첫 번째 필드를 인쇄해야 합니다.

then보고서의 첫 번째 필드를 인쇄하는 방법은 무엇입니까 ?

입력하다:

anhtdg5 03-Jul-2019  
kjushr7 04-Aug-2020  
bhyusj3 09-Mar-2017  
losyej9 09-Mar-2017  
nhtgsy57 09-Mar-2017  
bpolise3 09-Mar-2017  
uioshye2 14-Mar-2018   
zsethfyu 23-Nov-2018  
cnhysge 23-Mar-2018  

답변1

첫 번째 필드를 사용하고 싶지만 cut에 보내기 전에 닫으십시오 while.

read다음을 사용하여 단순히 필드를 분리 하면 어떨까요 ?

while read name date; do
    ...
    time_line=$(date -u -d "$date" +"%s")
    ...
    echo "$name"
done < /tmp/OutPrint

스크립트에는 어떻게든 작동하지만 더 나은 방법으로 작성할 수 있는 몇 가지 추가 복잡한 기호가 있습니다.

  • 쓸모없는 사용 cat.

  • 중간 변수를 직접 사용하는 대신 $now사용하기 위해 저장하는 이유:datedate

    time_now=$(date -u +"%s")
    
  • echo명령의 출력을 변수에 저장하는 것을 쓸모 없게 사용합니다 .

    difference=$((time_now - time_line))
    
  • 변수에 저장하는 대신 if 문에서 직접 사용할 수도 있습니다.

    if [ $((time_now - time_line)) -ge 2592000 ]
    

관련 정보