Logy podľa dátumu

meo

Logy podľa dátumu
« kdy: 02. 08. 2017, 11:17:54 »
Ahojte,
poradili by ste mi ako by som z jedneho logu ktorý vypada takto: "Wed Aug  2 10:29:45 CEST 2017 INFO:" vypísal všetky logy napr za posledný týždeň?


Mufasa

Re:Logy podľa dátumu
« Odpověď #1 kdy: 02. 08. 2017, 11:33:06 »
Je to vas locale?
`date +%c` sa podoba? Ak to nie je moc velky file asi by som si vypisal do premennej poslednych 7 datumov v tomto formate a grepol to

MP

Re:Logy podľa dátumu
« Odpověď #2 kdy: 02. 08. 2017, 11:33:54 »
journalctl --since (--until)

Mufasa

Re:Logy podľa dátumu
« Odpověď #3 kdy: 02. 08. 2017, 11:39:02 »
Co ak to nie je systemovy log, ale file z nejakej app?

Popravde ak to nepotrebujete automatizovat na velkej urovni tak
grep -e "Aug  [1-2]" -e "Jul 2[8-9]" -e "Jul 3[0-1]" file.log



erik80

Re:Logy podľa dátumu
« Odpověď #5 kdy: 02. 08. 2017, 11:52:43 »
#!/bin/bash
for d in `seq 7 -1 0`
do
   pttn=$(date -d "$d days ago" +'%a[ ]*%b[ ]*%e[ 0-9:]*%Z[ ]*%Y')
   grep "$pttn" log
done

meo

Re:Logy podľa dátumu
« Odpověď #6 kdy: 02. 08. 2017, 12:12:26 »
Ďakujem veľmi pekne :)

Tuxik

  • *****
  • 1 473
    • Zobrazit profil
    • E-mail
Re:Logy podľa dátumu
« Odpověď #7 kdy: 02. 08. 2017, 12:35:38 »
Nebo třeba...

Kód: [Vybrat]
#!/bin/bash
AGE=$2
CUR=$(date +%s)
MAGE=$(($CUR-(AGE*24*3600)))
cat $1 | while read line; do
    LTIME=$(  date --date "$(echo $line | cut -d' ' -f1-6)" +%s  )
    if [ $LTIME -ge $MAGE ]; then
        echo -e "$line"
    fi
done

použití
skript.sh nazev_logu pocet_dni
skript.sh log.log 10

gll

Re:Logy podľa dátumu
« Odpověď #8 kdy: 02. 08. 2017, 13:34:34 »
Nebo třeba...

Kód: [Vybrat]
#!/bin/bash
AGE=$2
CUR=$(date +%s)
MAGE=$(($CUR-(AGE*24*3600)))
cat $1 | while read line; do
    LTIME=$(  date --date "$(echo $line | cut -d' ' -f1-6)" +%s  )
    if [ $LTIME -ge $MAGE ]; then
        echo -e "$line"
    fi
done

použití
skript.sh nazev_logu pocet_dni
skript.sh log.log 10

tohle bude zoufale pomalé, pro větší logy nepoužitelné.

gll

Re:Logy podľa dátumu
« Odpověď #9 kdy: 02. 08. 2017, 14:05:45 »
#!/bin/bash
for d in `seq 7 -1 0`
do
   pttn=$(date -d "$d days ago" +'%a[ ]*%b[ ]*%e[ 0-9:]*%Z[ ]*%Y')
   grep "$pttn" log
done

tohle je dobré

Tuxik

  • *****
  • 1 473
    • Zobrazit profil
    • E-mail
Re:Logy podľa dátumu
« Odpověď #10 kdy: 02. 08. 2017, 14:17:32 »
Nebo třeba...

Kód: [Vybrat]
#!/bin/bash
AGE=$2
CUR=$(date +%s)
MAGE=$(($CUR-(AGE*24*3600)))
cat $1 | while read line; do
    LTIME=$(  date --date "$(echo $line | cut -d' ' -f1-6)" +%s  )
    if [ $LTIME -ge $MAGE ]; then
        echo -e "$line"
    fi
done

použití
skript.sh nazev_logu pocet_dni
skript.sh log.log 10

tohle bude zoufale pomalé, pro větší logy nepoužitelné.
To jo, na velký logy blbý, ale obecně dobře upravitelný :D

gll

Re:Logy podľa dátumu
« Odpověď #11 kdy: 02. 08. 2017, 15:08:40 »
Můžeš zkusit parsovámí v Pythonu:
https://stackoverflow.com/questions/466345/converting-string-into-datetime
https://stackoverflow.com/questions/1345827/how-do-i-find-the-time-difference-between-two-datetime-objects-in-python

funkce dateutil.parser.parse je celkem inteligentní. Stačí parse(line, fuzzy=True).date() a nemusí se specifikovat formát ani splitovat řádka.

gll

Re:Logy podľa dátumu
« Odpověď #12 kdy: 02. 08. 2017, 15:12:00 »
To jo, na velký logy blbý, ale obecně dobře upravitelný :D

ono je toblbé už na docela malé logy. Kdybyste tu smyčku přepsal do nějakého skriptovacího jazyka, nebude to delší ani hůře upravitelné a zrychlí se to mnohanásobně.

Tuxik

  • *****
  • 1 473
    • Zobrazit profil
    • E-mail
Re:Logy podľa dátumu
« Odpověď #13 kdy: 03. 08. 2017, 08:41:01 »
ono je toblbé už na docela malé logy. Kdybyste tu smyčku přepsal do nějakého skriptovacího jazyka, nebude to delší ani hůře upravitelné a zrychlí se to mnohanásobně.
Tak aby řeč nestála...

Kód: [Vybrat]
#!/usr/bin/python3

import sys
import time
import datetime

fromtime=time.time()-(int(sys.argv[2])*24*3600)

with open(sys.argv[1], 'rU') as f:
    for line in f:
        ldate = (line[0:29])
        secs=datetime.datetime.strptime(ldate, "%a %b %d %H:%M:%S %Z %Y").timestamp()
        if secs > fromtime:
            print(line,end="")

Nicméně pro velký logy je stejně nejefektivnější dohledat první vyhovující řádek a pak vypsat zbytek - třeba zkusit půlku souboru, větší/menší, půlku z půlky... v pár iteracích to najdeme a pak je to šup šup