Jak grepować plik dziennika w określonym czasie

22

Mam plik dziennika, każda linia w dzienniku jest poprzedzona datą, taką jak:

2012-03-06 11:34:48,657 blah blah blah...

Jak mogę uzyskać grepten plik i uzyskać tylko wiersze tylko od 8 rano do 11 wieczorem?

Mam na myśli, że chcę policzyć liczbę błędów występujących w godzinach od 8:00 do 23:00.

Rosdi
źródło

Odpowiedzi:

24
egrep '^[^ ]+ (0[89]|1[0-9]|2[012]):'

Szczegółowe wyjaśnienie można znaleźć w różnych regex (regular expression) tutoriale; egrepużywa składni „POSIX Extended” ( man 7 regex).

  • Pierwszy ^oznacza „początek linii”.

  • [^ ]+ po prostu dopasowuje pole daty, niezależnie od faktycznej daty.

    • [...]oznacza „dowolny znak między nawiasami”, więc [89]pasuje do jednego 8lub 9; [0-9]jest dowolną liczbą i [^ ]jest wszystkim oprócz spacji (z powodu ^nawiasów wewnętrznych).

    • +oznacza „jeden lub więcej z poprzednich” (na przykład, a+by dopasować a, aaai aaaaaaaa).

    • Zacznie ^[^ ]+się więc od początku wiersza i dopasuje tyle znaków spacji, ile może.

  • (...|...|...)oznacza „jeden z podanych wzorów”, to (0[89]|1[0-9]|2[012])znaczy „albo 0[89]czy 1[0-9]lub 2[012]”. Będzie pasować do wszystkich liczb od 08 do 22.


Nieco lepszą opcją jest:

awk -F'[: ]' '$2 >= 8 && $2 <= 22 { print }'

-FOpcja dzieli każdą linię do oddzielnych pól zgodnie z [: ]regex (pasująca zarówno :lub spacja), a awk sprawdza skrypt 2nd column (godzina).

grawitacja
źródło
Cześć, działa .. ale czy możesz dodać małe wyjaśnienie, jak to działa? Nie rozumiem tej ^[^ ]+części ...
Rosdi,
20

Po co zawracać sobie głowę używaniem grep? Możesz po prostu użyć sed.

przykład:

sed -n '/Jun 17 13:39:54/ , /Jun 18 10:50:28/p' kern.log

Spowoduje to wydrukowanie wszystkich dzienników między June 17 13:39:54iJune 18 10:50:28

Nima G.
źródło
1
Myślę, że OP chce wszystkich dzienników między 8 rano a 23 wieczorem, tylko te z konkretnego dnia.
Dennis
1
On też może to zrobić. Np .: sed -n '/ 2012-3-06 11:34:48 /, / 2012-3-06 16: 34: 48 / p' logfile.name
Nima G
1
Paskudna literówka. Miałem na myśli: nie te z określonego dnia.
Dennis
2
Problem z tym podejściem polega na tym, że plik dziennika musi zawierać linię z tym znacznikiem czasu. W powyższym przykładzie, jeśli nie ma linii ze znacznikiem czasu 2012-03-06 11:34:48, nic nie zostanie wydrukowane. Powyższe podejście awk zadziałałoby w takich przypadkach (tzn. Chcesz mieć wszystkie dzienniki z godziną od 8 do 11, ale nie wiesz, czy w dzienniku jest wpis w dzienniku 2012-03-06 08:00:00 lub coś w tym rodzaju godzina w ogóle).
user650654,
0

Jest o wiele łatwiejszy sposób na zrobienie tego.

Pobierz / dokumentacja: autodrgrep.kl.sh

Dowództwo:

./autodrgrep.kl.sh   notchef   /tmp/client.log   '2016-05-08_08:00:00,2016-05-08_23:00:00'   'INFO'   'a2ensite'   5  10  -show

Wyjaśnienie:

  • autodrgrep.kl.sh to nazwa narzędzia.

  • notchef to opcja przekazywana do narzędzia, która informuje go, co ma robić. W tym konkretnym przypadku informuje narzędzie, jaki jest typ pliku dziennika /tmp/client.log.

  • /tmp/client.log jest oczywiście plikiem dziennika.

  • 2016-05-08_19: 12: 00,2016-05-08_21: 13: 00 to zakres dat z dziennika, który chcesz przeskanować

  • „INFO” to jeden z ciągów w wierszach dzienników, które Cię interesują.

  • „a2ensite” to kolejny ciąg w tej samej linii, w którym spodziewasz się znaleźć ciąg „INFO”. Określenie tych dwóch ciągów (INFO i a2ensite) izoluje i przetwarza potrzebne linie znacznie szybciej, szczególnie jeśli masz do czynienia z ogromnym plikiem dziennika.

  • 5 określa Ostrzeżenie. Podając 5, program ma ostrzegać program jako OSTRZEŻENIE, jeśli istnieje co najmniej 5 wystąpień określonych ciągów wyszukiwania

  • 10 określa Krytyczny. Podając 10, nakazujesz programowi, aby ostrzegał jako KRYTYCZNY, jeśli istnieje co najmniej 10 wystąpień określonych ciągów wyszukiwania.

  • -show określa, jaki typ odpowiedzi otrzymasz. Podając opcję -shown, mówisz, że jeśli zostanie znalezione coś pasujące do określonych wzorców, zostanie wyświetlone na ekranie.

Przykładowy przebieg:

# ./autodrgrep.kl.sh notchef  /tmp/client.log   '2016-05-08_19:12:00,2016-05-08_21:13:00' 'INFO' 'a2ensite'  5  10  -show

[2016-05-08 19:12:58-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 19:12:58-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 19:12:58-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 19:13:09-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 19:13:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 19:42:57-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 19:42:57-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 19:42:57-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 19:43:08-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 19:43:11-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 20:12:58-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 20:12:58-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 20:12:58-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 20:13:10-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 20:13:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 20:42:59-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 20:42:59-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 20:42:59-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 20:43:09-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 20:43:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 21:12:59-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 21:12:59-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 21:12:59-07:00] INFO: execute[a2ensite default] ran successfully
23
2---78720---23---ATWFILF---(2016-05-08)-(19:12)---(2016-05-08)-(21:13) SEAGM

Co się stanie, jeśli w dzienniku nie ma określonego zakresu dat lub przedziału czasowego?

Każde uruchomienie powyższej komendy będzie zawsze miało wiersz (ostatni wiersz wyniku), który mówi „ATWFILF” lub „ETWNFILF”.

  • ATWFILF oznacza, że ​​rzeczywisty zakres dat lub przedział czasowy, którego szukasz, został znaleziony w dzienniku. To jest bardzo dobre.

  • ETWNFILF oznacza, że ​​rzeczywisty zakres dat lub przedział czasowy, którego szukasz, NIE został znaleziony w dzienniku. W takim przypadku zostanie wykryty i użyty czas najbliższy podanemu czasowi.

Uproszczona praca
źródło