comparando o tempo dado pelo usuário para o tempo do arquivo de log

1

Desculpas imediatas por perguntas mal-intencionadas - perguntas e cabeçalhos ..... aprendendo unix e seu comando hoje em dia, estou tentando descobrir uma solução para o cenário abaixo:

Digamos que eu tenha um arquivo de log que se pareça com:

 01-02-1988     12:00:00    I start 
 01-02-1988     12:00:01    I start
 01-02-1988     12:00:02    I start 
 01-02-1988     12:00:03    I start
 01-02-1988     12:00:04    I start 
 01-02-1988     12:00:05    I start
 01-02-1988     12:00:06    I start 
 01-02-1988     12:00:07    I start
 01-02-1988     12:00:08    I start 
 01-02-1988     12:00:09    I start
 01-02-1988     01:00:10    I start

e eu tomo um intervalo de tempo do usuário para o qual ele quer ver o status.Para filtrar todo o processo, eu posso fazer:

egrep $usr_time log.txt

Mas existe alguma maneira que eu possa fazer o mesmo para um período de tempo específico, como awk , pode coincidir com o valor para mim por $2 aqui ... mas como compará-lo por segundos (ss em hh: mm: ss) ???

Como por exemplo: suponha que eu queira registros de 12:00:01 - 12:00:06 , então basicamente o que eu preciso é extrair o terceiro valor do : delimiter e compará-lo .... como isso pode ser alcançado .... por favor ajude !!!!

    
por NoobEditor 12.02.2014 / 18:47

2 respostas

2

Se você pode ter certeza de que as entradas estão na ordem de tempo, você pode usar ambas as vezes (se ambas existirem no arquivo!) como endereços de início e parada:

start cmd:> sed -n -e /12:00:03/,/12:00:09/p file
01-02-1988     12:00:03    I start
01-02-1988     12:00:04    I start 
01-02-1988     12:00:05    I start
01-02-1988     12:00:06    I start 
01-02-1988     12:00:07    I start
01-02-1988     12:00:08    I start 
01-02-1988     12:00:09    I start

Se for possível que as horas de início e término não apareçam no arquivo, então você deve comparar (pode ser necessário incluir a data neste cálculo)

awk -v starttime="12:00:03" -v stoptime="12:00:09" \
  'BEGIN {FS=":"; $0=starttime; startts=$1*3600+$2*60+$3; '\
  '$0=stoptime; stopts=$1*3600+$2*60+$3; FS=" ";}; ' \
  '{line=$0; FS=":"; $0=$2; secs=$1*3600+$2*60+$3; if (secs>stopts) exit; '\
  'if (secs>=startts) print line; FS=" ";}' file

As strings podem ser comparadas diretamente:

awk -v starttime="12:00:03" -v stoptime="12:00:09" \
  '{line=$0; if ($2>stoptime) exit; '\
  'if ($2>=starttime) print line; FS=" ";}' file
    
por 12.02.2014 / 19:23
2

Supondo que o conteúdo esteja em um arquivo x.txt , você pode fazer isso da seguinte maneira:

awk ' $2~/12:00:0[1-6]/ { print }' x.txt

A expressão $2~/12:00:0[1-6]/ avaliará a segunda coluna em relação à regex fornecida e a instrução print imprimirá todas as linhas correspondentes. Se você quiser imprimir apenas a segunda coluna de cada linha, você pode fazer print $2 e assim por diante.

Para incluir variáveis de shell em awk , use -v , por exemplo:

ss=1 es=6 awk -v reg=12:00:0[$ss-$es] ' $2 ~ reg { print }' x.txt

Sugiro dar uma olhada nesta documentação do usuário awk , que foi muito bem escrita: link

    
por 12.02.2014 / 19:02

Tags