pesquisa certa data e hora como parâmetro de entrada e depois extrair múltiplos padrões de cada bloco de texto

0

Estou tentando descobrir uma lógica em que possamos passar o tempo & intervalo de datas como parâmetro de entrada que o executa no arquivo de log como abaixo e extrai padrões de correspondência de cada bloco de texto entre linhas em branco:

Veja um exemplo de conteúdo em um arquivo de log:

# 10/Oct/2017:11:14:12 -0400; conn=-1; op=59
dn: dc=capitalone,dc=com
changetype: modify
replace: ds-sync-state
ds-sync-state: 0000015b51d7bf33057e00000002
ds-sync-state: 0000015b53b701d30f0c00000003
ds-sync-state: 0000015b51d655e11a0c00000005

# 11/Oct/2017:10:40:29 -0400; conn=-1; op=44
dn: cn=schema
changetype: modify
replace: ds-sync-generation-id
ds-sync-generation-id: 8408

# 11/Oct/2017:10:40:30 -0400; conn=-1; op=59
dn: cn=admin data
changetype: modify
replace: ds-sync-state
ds-sync-state: 0000015b50e62ee409b700000002
ds-sync-state: 0000015b4a174d3f217500000002
ds-sync-state: 0000015b4ed4fcfb23a500000008
    
por Riz 13.10.2017 / 04:13

1 resposta

1

Solução

GNU awk :

Script

lookup_by_daterange.awk :

#!/usr/bin/awk -f

function get_ts(dt, ts){ 
    gsub("/"," ",dt); 
    sub(":"," ", dt);
    cmd="date -d \""dt"\" +%s"; 
    while(cmd | getline t) ts=t; 
    close(cmd); 
    return ts 
}
BEGIN {
    from = get_ts(from);  # 'from' datetime
    to = get_ts(to);    # 'to' datetime
}
/^# [0-9]{2}\//{ 
    ts = get_ts($2); 
    if (ts >= from && ts <= to) { 
        f=1; n=NR+3 
    } 
}
f && NR<=n { 
    print 
}
NR==n { 
    print "" 
}

Uso:

awk -v from="11/Oct/2017:10:40:29" -v to="11/Oct/2017:10:41:00" -f lookup_by_daterange.awk logfile

A saída:

# 11/Oct/2017:10:40:29 -0400; conn=-1; op=44
dn: cn=schema
changetype: modify
replace: ds-sync-generation-id

# 11/Oct/2017:10:40:30 -0400; conn=-1; op=59
dn: cn=admin data
changetype: modify
replace: ds-sync-state
    
por 13.10.2017 / 12:02

Tags