2017-02-20 1 views
1

Ich bekomme das Datum, das in einer Textdatei ist und es einer Variablen zugewiesen. Als ich das Datum aus der Datei grep, ich das bekommen,Vergleichen Sie das Systemdatum mit dem Datum aus einer Textdatei

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

So beschneiden ich nur das Datum, die mit diesem Befehl

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

Das Ergebnis

Jul 28 14:57 2017 GMT 

wäre Wie Konvertiere ich dieses Datum in die Anzahl der Sekunden, damit ich es mit dem Systemdatum vergleichen kann? Wenn es über 2 Tage alt ist.

Ich habe diesen Code, aber es funktioniert nicht. Ich erhalte eine Fehlermeldung, wenn ich es ausgeführt habe. Ich denke, weil $ dateFile eine Textdatei ist und nicht weiß, wie man sie konvertiert. Jede Hilfe wäre willkommen.

#!/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 

Antwort

0

Sie haben ein paar Fehler in Ihrem Skript. Bitte versuchen Sie die folgenden:

#!/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 

Allerdings wird dies nicht funktionieren: $dateFile=grep "After :" myfile.txt | cut -d ':' -f 2,4. In der Shell können Sie keinen Variablennamen mit $ voranstellen, da die Shell versucht, das Ergebnis als Variable auszuwerten und einen Befehl auszuführen und einer Variablen zuzuweisen, die Sie in $(....) oder mit Backticks umgeben müssen.

Beispiel mit variablen und Rohrleitungen an die während:

#!/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 

Beispiel Rohrleitungen, die grep und die während:

#!/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 

Hope this Ihre Fragen klärt.

+0

Ihr Code funktioniert perfekt. Vielen Dank. Ich frage mich nur, warum Sie eine Schleife benötigen, um jede Zeile in der Datei zu lesen, weil der Befehl grep automatisch die Informationen bekommt, die Sie brauchen ??? – user1736786

+0

Ich habe meine Antwort bearbeitet, um auf Ihre Frage zu antworten. Bitte wählen Sie die richtige Antwort, wenn Sie damit zufrieden sind. – artemisian

Verwandte Themen