GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Cara Mengekstrak Log Antara Dua Cap Waktu?

Saya ingin mengekstrak semua log di antara dua cap waktu. Beberapa baris mungkin tidak memiliki stempel waktu, tetapi saya juga menginginkan baris itu. Singkatnya, saya ingin setiap baris yang berada di bawah dua stempel waktu. Struktur log saya terlihat seperti:

[2014-04-07 23:59:58] CheckForCallAction [ERROR] Exception caught in +CheckForCallAction :: null
--Checking user--
Post
[2014-04-08 00:00:03] MobileAppRequestFilter [DEBUG] Action requested checkforcall

Misalkan saya ingin mengekstrak semuanya antara 2014-04-07 23:00 dan 2014-04-08 02:00 .

Harap diperhatikan bahwa stempel waktu mulai atau stempel waktu berakhir mungkin tidak ada di log, tetapi saya ingin setiap baris di antara dua stempel waktu ini.

Jawaban yang Diterima:

Anda dapat menggunakan awk untuk ini:

$ awk -F'[]]|[[]' 
  '$0 ~ /^[/ && $2 >= "2014-04-07 23:00" { p=1 }
   $0 ~ /^[/ && $2 >= "2014-04-08 02:00" { p=0 }
                                        p { print $0 }' log

Dimana:

  • -F menentukan karakter [ dan ] sebagai pemisah bidang menggunakan ekspresi reguler
  • $0 referensi baris lengkap
  • $2 referensi bidang tanggal
  • p digunakan sebagai variabel boolean yang menjaga pencetakan yang sebenarnya
  • $0 ~ /regex/ benar jika regex cocok dengan $0
  • >= digunakan untuk membandingkan string secara leksikografis (setara dengan misalnya strcmp() )

Variasi

Baris perintah di atas mengimplementasikan pencocokan interval waktu buka-kanan. Untuk mendapatkan semantik interval tertutup, cukup tambahkan tanggal yang tepat, mis.:

$ awk -F'[]]|[[]' 
  '$0 ~ /^[/ && $2 >= "2014-04-07 23:00"    { p=1 }
   $0 ~ /^[/ && $2 >= "2014-04-08 02:00:01" { p=0 }
                                           p { print $0 }' log

Jika Anda ingin mencocokkan cap waktu dalam format lain, Anda harus mengubah $0 ~ /^[/ sub-ekspresi. Perhatikan bahwa ini digunakan untuk mengabaikan baris tanpa stempel waktu dari logika hidup/mati cetak.

Misalnya untuk format cap waktu seperti YYYY-MM-DD HH24:MI:SS (tanpa [] kawat gigi) Anda dapat memodifikasi perintah seperti ini:

$ awk 
  '$0 ~ /^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-2][0-9]:[0-5][0-9]:[0-5][0-9]/
      {
        if ($1" "$2 >= "2014-04-07 23:00")     p=1;
        if ($1" "$2 >= "2014-04-08 02:00:01")  p=0;
      }
    p { print $0 }' log

(perhatikan bahwa pemisah bidang juga diubah – menjadi transisi kosong/tidak kosong, defaultnya)


Linux
  1. Cara menggunakan perintah ekor untuk Melihat Log Secara Real Time

  2. Bagaimana Memilih Kejadian Pertama Antara Dua Pola Termasuk Mereka?

  3. Bagaimana Cara Mengekstrak Log Antara Dua Cap Waktu?

  1. Bagaimana Cara Rsync File Antara Dua Remote?

  2. Bagaimana Cara Menghapus Journalctl?

  3. Bagaimana Cara Membuat Pipa Dua Arah Antara Dua Program?

  1. Ekstrak Nilai Antara Dua Pola Pencarian Pada Baris Yang Sama?

  2. Bagaimana cara mengekstrak waktu durasi dari keluaran ffmpeg?

  3. Bash:hitung waktu yang berlalu antara dua cap waktu