GNU/Linux >> Znalost Linux >  >> Linux

Jak extrahovat protokoly mezi dvěma časovými razítky?

Chci extrahovat všechny protokoly mezi dvěma časovými razítky. Některé řádky nemusí mít časové razítko, ale chci tyto řádky také. Zkrátka chci každý řádek, který spadá pod dvě časová razítka. Moje struktura protokolu vypadá takto:

[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

Předpokládejme, že chci extrahovat vše mezi 2014-04-07 23:00 a 2014-04-08 02:00 .

Upozorňujeme, že počáteční nebo koncové časové razítko nemusí být v protokolu, ale chci, aby mezi těmito dvěma časovými razítky byl každý řádek.

Přijatá odpověď:

Můžete použít awk pro toto:

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

Kde:

  • -F určuje znaky [ a ] jako oddělovače polí pomocí regulárního výrazu
  • $0 odkazuje na celý řádek
  • $2 odkazuje na pole data
  • p se používá jako booleovská proměnná, která hlídá skutečný tisk
  • $0 ~ /regex/ má hodnotu true, pokud se regulární výraz shoduje s $0
  • >= se používá k lexikografickému porovnávání řetězců (ekvivalent např. strcmp() )

Varianty

Výše uvedený příkazový řádek implementuje shodu časového intervalu otevření vpravo. Chcete-li získat sémantiku uzavřeného intervalu, stačí zvýšit správné datum, např.:

$ 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

V případě, že chcete porovnat časová razítka v jiném formátu, musíte upravit $0 ~ /^[/ podvýraz. Všimněte si, že dříve ignoroval řádky bez jakýchkoli časových razítek z logiky zapínání/vypínání tisku.

Například pro formát časového razítka jako YYYY-MM-DD HH24:MI:SS (bez [] složené závorky) můžete příkaz upravit takto:

$ 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

(všimněte si, že se také změní oddělovač pole – výchozí přechod na prázdný/neprázdný)


Linux
  1. Jak vybrat první výskyt mezi dvěma vzory, které je obsahují?

  2. Jak extrahovat protokoly mezi dvěma časovými razítky?

  3. Jak Rsync souborů mezi dvěma dálkovými ovladači?

  1. Extrahovat hodnotu mezi dvěma vyhledávacími vzory na stejném řádku?

  2. Jak vymazat Journalctl?

  3. Jak vytvořit obousměrné potrubí mezi dvěma programy?

  1. Jak extrahovat dobu trvání z výstupu ffmpeg?

  2. Jak zablokovat veškerý provoz mezi dvěma rozhraními?

  3. Bash:vypočítá čas, který uplynul mezi dvěma časovými značkami