Bagaimana cara grep file log dalam periode waktu tertentu

22

Saya memiliki file log, setiap baris dalam log diawali dengan tanggal, seperti:

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

Bagaimana cara saya grepfile ini dan hanya mendapatkan garis dari 8 pagi sampai 11 malam saja?

Tujuan saya adalah saya ingin menghitung jumlah kesalahan yang terjadi antara jam 8 pagi hingga 11 malam.

Rosdi
sumber

Jawaban:

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

Penjelasan terperinci dapat ditemukan di berbagai tutorial regex (ekspresi reguler); egrepmenggunakan sintaks "POSIX extended" ( man 7 regex).

  • Yang pertama ^berarti "mulai dari garis".

  • [^ ]+ hanya cocok dengan bidang tanggal, terlepas dari tanggal yang sebenarnya.

    • [...]berarti "karakter apa pun di antara tanda kurung", sehingga [89]akan cocok dengan salah satu 8atau 9; [0-9]adalah angka berapa pun, dan [^ ]apa pun kecuali spasi (karena ^kurung di dalam).

    • +berarti "satu atau lebih dari sebelumnya" (misalnya, a+akan cocok a, aaadan aaaaaaaa).

    • Jadi ^[^ ]+akan dimulai dengan awal baris, dan mencocokkan sebanyak mungkin karakter non-spasi.

  • (...|...|...)berarti "salah satu dari pola yang diberikan", sehingga (0[89]|1[0-9]|2[012])berarti "baik 0[89]atau 1[0-9]atau 2[012]". Ini akan cocok dengan semua angka dari 08 hingga 22.


Pilihan yang agak lebih baik adalah:

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

The -Fopsi membagi setiap baris dalam bidang yang terpisah sesuai dengan [: ]regex (pencocokan baik :atau spasi), dan awk skrip cek 2 kolom (jam).

grawity
sumber
Hai, ini berfungsi .. tetapi dapatkah Anda menambahkan sedikit penjelasan cara kerjanya? Saya tidak mendapatkan ^[^ ]+bagiannya ..
Rosdi
20

Kenapa repot-repot menggunakan grep? Anda cukup menggunakan sed.

contoh:

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

Ini akan mencetak semua log antara June 17 13:39:54danJune 18 10:50:28

Nima G
sumber
1
Saya pikir OP menginginkan semua log antara jam 8 pagi dan 11 malam, bukan hanya log dari hari tertentu.
Dennis
1
Dia bisa melakukannya juga. Contoh: sed -n '/ 2012-3-06 11:34:48 /, / 2012-3-06 16: 34: 48 / p' logfile.name
Nima G
1
Salah ketik. Maksud saya: bukan yang dari hari tertentu.
Dennis
2
Masalah dengan pendekatan ini adalah bahwa harus ada baris dalam file log dengan timestamp itu. Dalam contoh di atas, jika tidak ada garis dengan timestamp 2012-03-06 11:34:48, maka tidak ada yang akan dicetak. Pendekatan awk di atas akan berfungsi untuk kasus-kasus seperti itu (yaitu Anda ingin semua log dengan jam antara 8 dan 11, tetapi Anda tidak tahu apakah ada entri log pada waktu 2012-03-06 08:00:00 atau apa pun untuk itu jam sama sekali).
user650654
0

Sebenarnya ada cara yang jauh lebih mudah untuk melakukan ini.

Unduh / Dokumentasi: autodrgrep.kl.sh

Perintah:

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

Penjelasan:

  • autodrgrep.kl.sh adalah nama alat.

  • notchef adalah opsi yang diteruskan ke alat untuk memberi tahu apa yang harus dilakukan. Dalam kasus khusus ini, ia memberi tahu alat apa jenis file log /tmp/client.log.

  • /tmp/client.log tentu saja file log.

  • 2016-05-08_19: 12: 00,2016-05-08_21: 13: 00 adalah rentang tanggal dari dalam log yang ingin Anda pindai

  • "INFO" adalah salah satu string yang ada di baris log yang Anda minati.

  • "a2ensite" adalah string lain pada baris yang sama yang Anda harapkan untuk menemukan string "INFO". Menentukan dua string ini (INFO dan a2ensite) mengisolasi dan memproses garis yang Anda inginkan jauh lebih cepat, terutama jika Anda berurusan dengan file log besar.

  • 5 menentukan Peringatan. Dengan menentukan 5, Anda memberi tahu program untuk mengingatkan sebagai PERINGATAN jika setidaknya ada 5 kemunculan string pencarian yang Anda tentukan

  • 10 menentukan Kritis. Dengan menentukan 10, Anda memberi tahu program untuk mengingatkan sebagai KRITIS jika setidaknya ada 10 kemunculan string pencarian yang Anda tentukan.

  • -show menentukan jenis respons apa yang akan Anda dapatkan. Dengan menentukan -shown, Anda mengatakan jika ada yang cocok dengan pola yang ditentukan, keluaran ke layar.

Contoh dijalankan:

# ./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

Bagaimana jika rentang tanggal atau kerangka waktu yang ditentukan pengguna tidak ada dalam log?

Setiap menjalankan perintah di atas akan selalu memiliki garis (baris terakhir dari output) yang mengatakan "ATWFILF" atau "ETWNFILF".

  • ATWFILF berarti bahwa rentang tanggal aktual atau kerangka waktu yang Anda minta dicari ditemukan di log. Jadi ini sangat bagus.

  • ETWNFILF berarti rentang tanggal aktual atau kerangka waktu yang Anda minta dicari TIDAK ditemukan dalam log. Dalam hal ini, waktu terdekat dengan waktu yang Anda tentukan akan dideteksi dan digunakan sebagai gantinya.

Pekerjaan Sederhana
sumber