Extrahieren Sie Einträge aus einer Datei mit einem Datum von einem Datum zum anderen

Extrahieren Sie Einträge aus einer Datei mit einem Datum von einem Datum zum anderen

Es gibt eine Datei, die Einträge mit dem ersten und zweiten Feld als Datum und Uhrzeit in der folgenden Reihenfolge enthält: 2015/10/14 00:33:37.

Die Datei hat über 100.000 Zeilen und wird ständig aktualisiert. Einträge in der Datei müssen vom frühesten Montag 00:00:00 bis Sonntag 23:59:59 ausgewählt werden.

2015/10/11 23:55:37 abc1 def1 2015/10/11 23:55:39 abc2 def2 2015/10/11 23:56:19 abc3 def3 2015/10/11 23:56:46 abc4 def4 2015/10/11 23:57:46 abc5 def5 2015/10/12 0:04:25 abc6 def6 2015/10/12 0:04:44 abc7 def7 2015/10/12 0:04:44 abc8 def8 2015/10/12 0:04:44 abc9 def9 2015/10/12 0:04:44 abc10 def10 2015/10/12 0:04:44 abc11 def11 2015/10/12 0:04:44 abc12 def12 2015/10/12 0:04:44 abc13 def13 2015/10/12 0:04:44 abc14 def14 2015/10/12 0:04:44 abc15 def15 2015/10/12 0:04:48 abc16 def16 2015/10/12 0:04:48 abc17 def17 2015/10/12 0:04:48 abc18 def18 2015/10/12 0:04:48 abc19 def19 2015/10/12 0:04:49 abc20 def20 2015/10/12 0:04:49 abc21 def21 2015/10/12 0:08:36 abc22 def22 2015/10/12 0:08:36 abc23 def23 2015/10/12 0:08:36 abc24 def24 2015/10/12 0:08:36 abc25 def25 2015/10/12 0:08:36 abc26 def26 2015/10/12 0:08:36 abc27 def27 2015/10/12 0:08:36 abc28 def28 2015/10/12 0:08:37 abc29 def29 2015/10/12 0:08:37 abc30 def30

Antwort1

Dieses Shell-Skriptfragment erstellt einen erweiterten regulären Ausdruck (mit /entsprechend maskierten Zeichen), der alle Tage vom letzten Montag bis zum folgenden Sonntag im YYYY/MM/DDFormat enthält. Anschließend wird dieser verwendet, um grepdie Protokolldatei zu durchsuchen.

DAYS=$(for D in {0..6} ; do 
           date -d "last monday + $D days" +'%Y\\/%m\\/%d'
       done | xargs | 
       sed -e 's/ /|/g'
      )

REGEX="^($DAYS) "

grep -E "$REGEX" logfile.txt

Wenn Sie lieber einfache reguläre Ausdrücke verwenden möchten, ändern Sie die letzten Zeilen wie folgt:

REGEX="^\($DAYS\) "
REGEX=$(printf "%s" "$REGEX" | sed -e 's/\([|]\)/\\\1/g')

grep "$REGEX" logfile.txt

grepEine weitere Möglichkeit besteht darin , die Optionen -F(feste Zeichenfolge) und -f(Datei) mit der Prozessersetzungsfunktion der Shell <( ... )wie folgt zu verwenden :

DAYS=$(for D in {0..6} ; do 
           date -d "last monday + $D days" +'%Y/%m/%d'
       done )

grep -F -f <(echo "$DAYS") logfile.txt

oder auch

grep -F -f <( for D in {0..6} ; do 
              date -d "last monday + $D days" +'%Y/%m/%d'
              done ) logfile.txt

HINWEIS: Diese letzten beiden Versionen stimmen mit einem Datum in diesem Format überall in der Zeile überein, nicht nur am Anfang der Zeile. Bei dem von Ihnen angegebenen Beispiel dürfte dies kein Problem darstellen.

verwandte Informationen