2016-07-25 11 views
0

Ich habe eine Textdatei, die wie folgt aussieht:entfernt Linie mit bash in Textdatei, wenn das Datum älter als 30 Tage sind

test10 2016-05-30 207 
test11 2016-06-01 207 
test12 2016-07-20 207 
test13 2016-07-21 207 
test14 2016-07-25 207 

Und ich mag die Zeilen aus der Textdatei entfernen, wenn dieses Datum älter als 30 Tage. Wie kann ich das machen? Ich habe etwas gelesen sed, aber nicht sicher, ob es getan werden kann oder wie man es macht.

+2

Können Sie die verfügbaren Werkzeuge angeben? Es ist möglich, dies mit 'sed' und GNU' date' zu ​​implementieren, aber ich habe es schwer, eine vollständig korrekte Implementierung zu finden, die sich nicht mindestens teilweise auf GNU-Datum, GNU awk oder komplett verlässt Nicht-POSIX-spezifiziertes Werkzeug wie "Perl". –

Antwort

6

Das Schöne an YYYY-MM-DD ist, dass seine Alpha-Sortierung identisch mit seiner Sortierreihenfolge als Datumsobjekt ist - so können Sie einfach eine Zeichenfolge generieren, die das Cutoff-Datum darstellt und damit vergleichen.

Wenn Sie GNU Datum:

cutoff=$(date -d 'now - 30 days' '+%Y-%m-%d') 
awk -v cutoff="$cutoff" '$2 >= cutoff { print }' <in.txt >out.txt && mv out.txt in.txt 

Es ist auch möglich, auf GNU awk verlassen (gawk) statt GNU Datum:

gawk -v current="$(date +"%Y %m %d %H %M %S")" \ 
    'BEGIN { 
    cutoff_secs = mktime(current) - (60 * 60 * 24 * 30) 
    } 

    { 
    line_secs=mktime(gensub(/-/, " ", "g", $2) " 00 00 00") 
    if (line_secs >= cutoff_secs) { print } 
    }' <in.txt >out.txt && mv out.txt in.txt 

Beachten Sie, dass diese Umsetzung in der aktuellen Runde beginnt Vor 30 Tagen, anstatt zu Beginn des Tages vor 30 Tagen; Ersetzen Sie %H %M %S durch 00 00 00, wenn Sie dieses Verhalten nicht möchten.

+0

@EdMorton, ich bin neugierig - was ist Ihre Meinung über die Möglichkeit, dies ohne irgendwelche GNUisms überhaupt zu implementieren? –

+0

Es ist nicht vollständig in awk möglich und selbst wenn Sie "date" verwenden, um das aktuelle Datum zu erhalten und 30 Tage subtrahieren, müssten Sie Schalttage und DST verarbeiten (die Sie pro TZ definieren/berechnen müssten, um tragbar zu sein) . Es ist möglich, aber eine PITA, nicht etwas, das ich jemals annehmen würde. –

+0

eigentlich ... Ich denke, ich erinnere mich vage daran, etwas wie dieses pre-GNU machen zu müssen, indem ich 'touch -a' benutze, um Dateien in einem temporären Verzeichnis mit den angegebenen Zeitstempeln für ihre Namen plus Zugriffszeiten zu erstellen und dann' find - 30 '(oder was auch immer es war), um diejenigen zu finden, deren Zugriffszeit vor 30 Tagen war. Nicht gerade effizient! –

Verwandte Themen