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 datap
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ý)