2012-06-21 10:54:47 +0000 2012-06-21 10:54:47 +0000
22
22

Jak przeszukiwać grepem plik dziennika w określonym przedziale czasowym

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

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

Jak mogę grep ten plik i uzyskać tylko linie od 8 rano do 11 wieczorem?

Moim zamiarem jest policzenie liczby błędów występujących w godzinach od 8 do 23.

Odpowiedzi (3)

24
24
24
2012-06-21 11:08:20 +0000
egrep '^[^]+ (0[89]|1[0-9]|2[012]):'

Szczegółowe wyjaśnienie można znaleźć w różnych regex (regular expression) tutorialach; egrep używa “POSIX extended” składni (man 7 regex).

  • Pierwsze ^ oznacza “początek linii”.

  • [^]+ po prostu pasuje do pola daty, niezależnie od rzeczywistej daty.

  • (...|...|...) oznacza “którykolwiek z podanych wzorców”, więc (0[89]|1[0-9]|2[012]) oznacza “albo 0[89] albo 1[0-9] albo 2[012]”. Dopasuje wszystkie liczby od 08 do 22.


Nieco lepszą opcją jest:

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

Opcja -F dzieli każdy wiersz na osobne pola według regexu [:] (pasującego albo do : albo do spacji), a skrypt awk sprawdza drugą kolumnę (godzinę).

21
21
21
2012-06-21 11:11:02 +0000

Po co zawracać sobie głowę grepem? 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 wyświetlenie wszystkich logów pomiędzy June 17 13:39:54 a June 18 10:50:28

0
0
0
2016-05-09 06:43:49 +0000

W rzeczywistości istnieje znacznie łatwiejszy sposób, aby to zrobić.

Pobierz/Dokumentacja: autodrgrep.kl.sh

Polecenie:

./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 jest opcją, która jest przekazywana do narzędzia, aby powiedzieć mu co ma robić. W tym konkretnym przypadku, mówi ona narzędziu, jakiego typu jest plik /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 logu, który chcesz przeskanować

  • “INFO” to jeden z ciągów znaków, który znajduje się w interesujących Cię liniach logów.

  • “a2ensite” jest kolejnym ciągiem w tej samej linii, w której spodziewasz się znaleźć ciąg “INFO”. Określenie tych dwóch łańcuchów (INFO i a2ensite) izoluje i przetwarza linie, które chcesz o wiele szybciej, szczególnie jeśli masz do czynienia z ogromnym plikiem dziennika.

  • 5 określa Ostrzeżenie. Podając 5, mówisz programowi, aby alarmował jako OSTRZEŻENIE, jeśli jest co najmniej 5 wystąpień podanych przez ciebie łańcuchów wyszukiwania.

  • 10 określa Krytyczny. Określając 10, każesz programowi alarmować jako KRYTYCZNY, jeśli istnieje co najmniej 10 wystąpień podanych łańcuchów wyszukiwania.

  • -show określa typ odpowiedzi, jaką otrzymasz. Podając opcję -shown, mówisz, że jeśli zostanie znalezione cokolwiek pasującego do podanych wzorców, wyświetlone zostanie wyjście na ekran.

Przykładowe uruchomienie:

# ./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 jeśli zakres dat lub czasu określony przez użytkownika nie znajduje się w dzienniku?

Każde uruchomienie powyższego polecenia zawsze będzie miało linię (ostatni wiersz wyjścia), która mówi “ATWFILF” lub “ETWNFILF”.

  • ATWFILF oznacza, że rzeczywisty zakres dat lub przedział czasowy, którego szukałeś, został znaleziony w dzienniku. Jest to więc bardzo dobry wynik.

  • ETWNFILF oznacza, że rzeczywisty zakres dat lub przedział czasowy, o który prosiłeś, NIE został znaleziony w dzienniku. W tym przypadku zostanie wykryty i użyty czas najbardziej zbliżony do podanego przez użytkownika.