script para contar a ocorrência da string específica no intervalo de tempo especificado

1

Estamos tentando escrever um script "sendemail.sh" para contar o número de ocorrências de uma string específica em um arquivo de log "SendEmail.log" dentro do intervalo especificado. Nós temos um arquivo de log. Na medida em que estamos procurando por um padrão "ReqInputMsgLog" e precisa contar o número de vezes que ocorreu no período determinado, por exemplo: de "2014-08-19 11:30" para "2014-08-19 11:34" . E o nosso script é assim:

#!/bin/sh
enterdate=$1
echo $enterdate
enddate=$2
enterdate1='date +%s -d $enterdate +"%Y-%m-%d %H:%M"'

echo $enterdate1
enddate1='date +%s -d $enddate +"%Y-%m-%d %H:%M"'
echo $enddate
count=0
cat SendEmail.log | grep "ReqInputMsgLog" | awk -F "[" '{print $3}' | awk -F "," '{print $1}' > /con/scripts_server/file.txt
for line in 'cat /con/scripts_server/file.txt'
do
logdate='echo $line | awk -F : '{print $1":"$2}''
if [[ $logdate < $enddate1 ]];
        then
        count='expr $count + 1'
        fi
done
echo $count

Mas quando estamos tentando executar o script pelo comando abaixo, ele não mostra a contagem correta.

./sendemail.sh "2014-08-19 11:30" "2014-08-19 11:34"

O arquivo de log é muito grande. Um pequeno trecho foi postado aqui.

INFO [SIBJMSRAThreadPool : 5] [2014-08-19 11:18:24,471] SendEmail - 8/19/14 11:18 AM,ECCF25B0-0147-4000-E000-1B830A3C05A9,ReqInputMsgLog,SendEmail,<?xml version="1.0" encoding="UTF-8"?>
<in:sendEmailRequestMsg xmlns:in="http://EmailMed/EmailMedInterface" xmlns:ns0="wsdl.http://EmailMed/EmailMedInterface" xmlns:ns1="http://EmailMed/EmailMedInterface" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:me="wsdl.http://EmailMed/EmailMedInterface" xsi:type="me:sendEmailRequestMsg">
<in:sendEmail xmlns:xci0="http://EmailMed/EmailMedInterface">
INFO [SIBJMSRAThreadPool : 7] [2014-08-19 11:18:14,235] SendEmail - 8/19/14 11:18 AM,ECCEFDB2-0147-4000-E000-1B830A3C05A9,ReqInputMsgLog,SendEmail,<?xml version="1.0" encoding="UTF-8"?>
<in:sendEmailRequestMsg xmlns:in="http://EmailMed/EmailMedInterface" xmlns:ns0="wsdl.http://EmailMed/EmailMedInterface" xmlns:ns1="http://EmailMed/EmailMedInterface" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:me="wsdl.http://EmailMed/EmailMedInterface" xsi:type="me:sendEmailRequestMsg">
<in:sendEmail xmlns:xci0="http://EmailMed/EmailMedInterface">
INFO [SIBJMSRAThreadPool : 7] [2014-08-19 11:18:14,241] SendEmail - xmlText: <?xml version="1.0" encoding="UTF-8"?>

Após o comando awk, obteremos um arquivo "/con/scripts_server/file.txt", que é semelhante ao seguinte:

2014-08-19 11:28:03
2014-08-19 11:28:06
2014-08-19 11:28:17
2014-08-19 11:28:53
2014-08-19 11:29:02
2014-08-19 11:29:47
2014-08-19 11:29:57
2014-08-19 11:30:07
2014-08-19 11:30:17
2014-08-19 11:30:19
2014-08-19 11:30:19
2014-08-19 11:30:22
2014-08-19 11:30:25
2014-08-19 11:30:25
2014-08-19 11:30:36
2014-08-19 11:30:51
2014-08-19 11:30:56
2014-08-19 11:30:59
2014-08-19 11:30:59
2014-08-19 11:31:08
2014-08-19 11:31:25
2014-08-19 11:32:19
2014-08-19 11:32:22
2014-08-19 11:32:27
2014-08-19 11:32:28
2014-08-19 11:32:41
2014-08-19 11:32:49
2014-08-19 11:32:59
2014-08-19 11:33:27
2014-08-19 11:33:41
2014-08-19 11:34:07
2014-08-19 11:34:14
2014-08-19 11:34:21
2014-08-19 11:34:25
2014-08-19 11:34:38
2014-08-19 11:34:50
2014-08-19 11:34:58
    
por pruthvi 20.08.2014 / 09:25

2 respostas

0

Use o seguinte para calcular as linhas entre duas variáveis de tempo. Coloque o seguinte código em um arquivo chamado countOcurrences .

#!/bin/bash

 awk "/$1/,/$2/"'{count++} END{ printf "There are %s lines\n",  count}' con/scripts_server/file.txt

Execute da seguinte forma.

./countOcurrences "2014-08-19 11:30:07" "2014-08-19 11:34:07"

Se file.txt for preenchido com um novo date/time cada vez que ocorrer uma correspondência de padrões, os itens acima funcionarão.

    
por 20.08.2014 / 14:18
0

Primeiro de tudo, encontrei 2 erros tentando recriar seu problema date: extra operand 11:34:14' Try date --help 'para mais informações. ./script.sh: line 15: 1408448098: No such file or directory

Pelo que entendi você isolou as datas que lhe interessam em arquivo.txt de acordo com a entrada do usuário e deseja contar ocorrências lá.

Codifiquei isto:

#!/bin/bash

#Start/End dates to encolse count range
startDate="2014-08-19 11:28:00"
endDate="2014-08-19 11:35:00"
#Concert these dates to seconds since Epoch
startDateEpoch=$(date --date="$startDate" +%s)
endDateEpoch=$(date --date="$endDate" +%s)

#Read file.txt count occurences
while read line
do

processingDate=$(date --date="$line" +%s)
  if [ $processingDate -lt $endDateEpoch ] && \
  [ $processingDate -gt $startDateEpoch ]; then
    echo "APOEL FC";
  fi

done < file.txt

Seu arquivo.txt, conforme anexado aqui, contém 37 linhas, portanto:

sysadmin@omg:/tmp$ ./script.sh | wc
     37      74     333

Isso parece correto para

startDate="2014-08-19 11:28:00"
endDate="2014-08-19 11:35:00"

Alterando as datas para:

startDate="2014-08-19 11:28:03"
endDate="2014-08-19 11:34:58"

sysadmin@omg:/tmp$ ./script.sh  | wc
     35      70     315

retorna 35 ocorrências que parecem corretas, já que a primeira e a última data devem ser excluídas.

Assim, a conversão para segundos desde a Epoch deve ter algo errado na sintaxe e o < operador na sua declaração if estava causando uma pequena bagunça.

Como diretrizes gerais, prefira usar operadores -lt -gt (menor que, maior que) para if. Também tente evitar o fechamento do comando nos backticks - Prefira usar $ (comando).

Codificação feliz.

    
por 22.08.2014 / 17:34