2017-02-20 8 views
1

Я получаю дату, которая находится внутри текстового файла и присваивается переменной. Когда я Grep дату из файла, я получаю это,Сравните системную дату с датой из текстового файла

Not After : Jul 28 14:09:57 2017 GMT 

Так что я только обнажаются дату, с помощью этой команды

echo $dateFile | cut -d ':' -f 2,4 

Результат будет

Jul 28 14:57 2017 GMT 

Как я конвертирую эту дату в число секунд, поэтому я могу сравнить ее с системной датой? Если ему больше 2 дней.

У меня есть этот код, но он не работает. Я получаю сообщение об ошибке, когда я его запускал. Я думаю, что это потому, что $ dateFile является текстовым файлом, и он не знает, как его преобразовать. Любая помощь будет оценена по достоинству.

#!/bin/bash 

$dateFile=grep "After :" myfile.txt | cut -d ':' -f 2,4 

AGE_OF_MONTH="172800" # 172800 seconds = 2 Days 
NOW=$(date +%s) 
NEW_DATE=$((NOW - AGE_OF_MONTH)) 

if [ $(stat -c %Y "$dateFile") -lt ${NEW_DATE} ]; then 
    echo Date Less then 2 days 
else 
    echo Date Greater then 2 days 
fi 

ответ

0

У вас есть пара ошибок в вашем скрипте. Пожалуйста, попробуйте ниже:

#!/bin/bash 

# capture the seconds since epoch minus 2 days 
NOW=`expr $(date '+%s') - 172800` 

# read every line in the file myfile.txt 
while read -r line; 
do 
    # remove the unwanted words and leave only the date info 
    s=`echo $line | cut -d ':' -f 2,4` 
    # parse the string s into a date and capture the number of seconds since epoch 
    date=$(date -d "$s" '+%s') 

    # compare and print output 
    if [ $date -lt $NOW ]; then 
    echo "Date Less then 2 days, s=$s, date=$date, now=$NOW" 
    else 
    echo "Date Greater then 2 days, s=$s, date=$date, now=$NOW" 
    fi 
done < myfile.txt 

Однако это не будет работать: $dateFile=grep "After :" myfile.txt | cut -d ':' -f 2,4. В оболочке вы не можете префиксное имя переменной с $, так как оболочка попытается оценить результат как переменную, а также для выполнения команды и присвоения ей переменной, которую необходимо окружить в $(....) или с обратными окнами.

Пример с переменным и обжигающе его на время:

#!/bin/sh 

dateFile=`grep "After :" my.txt | cut -d ':' -f 2,4` 

# capture the seconds since epoch minus 2 days 
NOW=`expr $(date '+%s') - 172800` 

echo "$dateFile" | while read -r line; 
do 
    # parse the string s into a date and capture the number of seconds since epoch 
    date=$(date -d "$line" '+%s') 

    # compare and print output 
    if [ $date -lt $NOW ]; then 
    echo "Date Less then 2 days, s=$line, date=$date, now=$NOW" 
    else 
    echo "Date Greater then 2 days, s=$line, date=$date, now=$NOW" 
    fi 
done 

Пример конвейеру Grep и время:

#!/bin/sh 

# capture the seconds since epoch minus 2 days 
NOW=`expr $(date '+%s') - 172800` 

grep "After :" myFile.txt | cut -d ':' -f 2,4 | while read -r line; 
do 
    # parse the string s into a date and capture the number of seconds since epoch 
    date=$(date -d "$line" '+%s') 

    # compare and print output 
    if [ $date -lt $NOW ]; then 
    echo "Date Less then 2 days, s=$line, date=$date, now=$NOW" 
    else 
    echo "Date Greater then 2 days, s=$line, date=$date, now=$NOW" 
    fi 
done 

Надеется, что это проясняет ваши вопросы.

+0

Ваш код работает отлично. Спасибо. Просто интересно, зачем вам нужен цикл для чтения каждой строки в файле, потому что команда grep автоматически получит нужную вам информацию ??? – user1736786

+0

Я отредактировал свой ответ, чтобы ответить на ваш вопрос. Пожалуйста, выберите его как правильный ответ, если вы его удовлетворены. – artemisian

Смежные вопросы