2012-04-10 15 views
1

Ich habe strftime Format der Zeit, sagen wir (%Y-%m-%d %H:%M:%S) und eine Datei, die diese Art von Daten enthalten sollte, z. (2012-02-11 17:15:00). Ich muss überprüfen, ob das angegebene Muster tatsächlich mit den Daten übereinstimmt. Wie geht man das an? awk, Datum?Überprüfen, ob das gegebene strftime Format mit einem Datum übereinstimmt

EDIT: Weitere Informationen: Der Benutzer gibt das Strftime-Format, sagen wir bei der Eingabe. Dann gibt er eine Datei ein, die diese Daten enthalten soll. Ich muss sicherstellen, dass diese Daten gültig sind (er hat keinen Fehler gemacht). Also muss ich die Zeilen in der Eingabedatei überprüfen und sehen, ob es Daten gibt, die dem gegebenen Muster entsprechen. Beispiel:

  • Benutzer gibt Strftime Format: (%Y-%m-%d %H:%M:%S)

    Eingabedatei: (2012-02-11 17:15:00) long sentence

    VALID

  • Benutzer gibt Strftime Format: Date[%Y.%m.%d %H:%M:%S]

    Eingabedatei: Date-2012.02.11 17:15:00- long sentence

    INVALID

+0

ich verstehe nicht, willst du das - "echo" (2012-02-11 17:15:00) "| gawk '{if (NR == 1) druck strftime (" (%) Y-% m-% d% H:% M:% S) "), $ 0} ' – yazu

+0

Ich habe meinen Versuch, es zu lösen, gelöscht, da es ein Unsinn war, als ich erkannte. Ich muss nur prüfen, ob es passt. thx – tsusanka

+0

möglich duplicate von [awk - Überprüfung Timecode] (http://stackoverflow.com/questions/10050351/awk-checking-timecode) –

Antwort

0

Wenn Sie aktuelle Datumzeit überprüfen möchten:

echo "(2012-02-11 17:15:00)" | grep "$(date "+%Y-%m-%d %H:%M:%S")" 

Wenn eine andere benötigen Sie GNU Datum (Option -d). Dies funktioniert für mich:

echo "(2012-02-11 17:15:00)" | 
grep "$(date -d "2012-02-11 17:15:00" "+%Y-%m-%d %H:%M:%S")" 
+0

Dies überprüft nur die Daten im Inneren, aber ich muss auch die Klammern überprüfen. Zum Beispiel wird dies bestätigen 'x2012-02-11 17:15:00)' auch ... Leider (wechseln wir die Klammer mit "x") "echo" x2012-02-11 17: 15: 00x "| grep "$ (Datum -d" x2012-02-11 17: 15: 00x "" + x% Y-% m-% d% H:% M:% Sx ")" 'funktioniert nicht – tsusanka

+0

Ich möchte modifiziere meine Frage zum besseren Verständnis, aber ich weiß einfach nicht wie .. weißt du was ich erreichen möchte? – tsusanka

+0

Nun, fügen Sie einfach Klammern im Datumsspezifizierer hinzu: 'grep" $ (Datum -d "2012-02-11 17:15:00" "+ (% Y-% m-% d% H:% M:% S) ")" 'Wenn Sie eine andere Antwort benötigen, kann das Eingabebeispiel helfen. – yazu

1

Wenn Sie einen externen Helfer binären erlauben, ich dateutils zu Batch-Prozess Datums- und Uhrzeitdaten geschrieben haben.

dconv -q -i '(%Y-%m-%d %H:%M:%S)' <<EOF 
not a match: 2012-04-10 12:00:00 
a match: (2012-04-10 13:00:00) 
EOF 

geben

2012-04-10T13:00:00 

-i das Eingabeformat ist, -q unterdrückt Warnungen. Und dconv versucht, die Eingangsleitungen mit Ausgangsleitungen (in diesem Fall zu wandeln es wandelt Linien ISO-Standardformat entspricht.

Also das verwendet wird, eine Datei entspricht vollständig, wenn die Anzahl der Eingangsleitungen gleich die Anzahl der Ausgangsleitungen.

+0

Leider wahrscheinlich nicht, da dies eine Hausaufgabe ist und ich sollte nur "Standard" Unix-Programme verwenden. Das ist genau das, was ich versuche zu tun. Kann das nicht mit awk gemacht werden? Danke für die Antwort. – tsusanka

+0

das Problem ist, dass awk keine 'strptime()' -Funktion hat, noch Perl, leider (ohne Berücksichtigung CPAN-Erweiterungen) – hroptatyr

+0

hm, habe eine Menge Forschung getan und ich kann einfach nichts finden. Du denkst wirklich, dass das ohne C nicht gelöst werden kann? – tsusanka

0

ich einen Brute-Force-Ansatz dazu nehmen würde: ersetzen jede %X Spezifizierer mit einem entsprechenden regulären Ausdruck, dann können Sie Zeilen herausfiltern, die nicht die resultierende erzeugte Regex:

user_format="%Y-%m-%d" 
awk -v fmt_string="$user_format" ' 
    BEGIN { 
    gsub(/[][(){}?|*+.]/ "\\&", fmt_string) # protect any regex-special chars 
    gsub(/%Y/, "([0-9]{4})", fmt_string) 
    gsub(/%m/, "(0[1-9]|1[012])", fmt_string) 
    gsub(/%d/, "(0[1-9]|[12][0-9]|3[01])", fmt_string) 
    # and so on 
    } 
    $0 !~ "^" fmt_string {print "line " NR " does not match: " $0} 
' filename 
+0

Ooh, das ist brutal ... sieht aus, als gäbe es nichts Besseres – tsusanka

Verwandte Themen