Como posso corresponder a data depois de acertar uma correspondência de padrão no awk para garantir que a correspondência é atual? [fechadas]

0

Basicamente eu estou olhando para uma entrada de log como esta:

*** Send Command has completed Successfully 
Transmitted 508200 bytes in 1 seconds
File Transfer Complete
RemoteTransactionNumber is ***********
************Server: Transfer Mode Set To Send
: *********************************************************50 al**********b:Y 
lf:"*********************************************************" rf:"*************
*(+1)" **************************************41
2017/04/18 13:05:32 About to execute the following Send command:

Eu defini uma variável $ LOGGER e armazenei os dados registrados nela porque está em um servidor remoto. Eu também criei uma variável chamada $ currentdate e estou armazenando:

currentdate=$(date +"%Y/%m/%d/ %I")

Então meu tempo atual enquanto posa este Q parece: 2017/04/19/01

Então, digamos que eu queira combinar em "Enviar comando foi concluído com sucesso" Eu fiz o seguinte:

ALERT=$(echo "$LOGGER" | awk "/Send Command has completed Successfully/" | grep -A 12 $currentdate)

Eu, então, estou tentando encontrar 12 linhas procurando a data atual & tempo até a hora para ter certeza de que o envio que estou correspondendo é atual porque é tudo que me importa quando esse script é executado.

Mas esse último awk | O comando grep -A 12 não está funcionando ... alguma idéia de como eu posso procurar a data e verificar se ela corresponde a $ currentdate depois de acertar uma correspondência do awk? Isso tudo está sendo feito em variáveis locais depois de recuperar um log scrape de um comando de passagem SSH FYI, portanto, nenhum arquivo real está sendo manipulado neste momento.

Editar: para dar uma imagem mais clara também porque eu estou fazendo o que eu estou tentando fazer aqui é qualquer jogo que eu recebo para a hora atual que eu preciso para reportar. E a data está dentro de 12 linhas da entrada "Enviar bem-sucedido". Na verdade, estou usando a passagem SSH para remoto em servidores, pegue o número de arquivos de log gravados na última hora. Então eu vou entrar e pegar as últimas 100 linhas de cada e armazená-lo na variável $ Logger assim:

COMMAND1="find /xxy -mmin -60 | wc -l"
FILENUM='/xxy-1.05/sshpass  -p$PASS ssh -q -o StrictHostKeyChecking=no -o 
ConnectTimeout=310 $USER@$HOST "$COMMAND1"

COMMAND2="find /xxy -mmin -60 | tail -n $FILENUM | xargs tail -n100"
LOGGER='/xxy-1.05/sshpass  -p$PASS ssh -q -o StrictHostKeyChecking=no -o 
ConnectTimeout=310 $USER@$HOST "$COMMAND2"

Então, dado que eu preciso rever todas as datas dos jogos, eu não tinha certeza da melhor maneira de fazê-lo e guardá-lo em uma variável (o que o awk tende a fazer e por que foi minha primeira escolha)

    
por JHarder51 19.04.2017 / 19:43

2 respostas

1

Quando algo não funciona, você deveria tentar separá-lo e ver o que as peças fazem assim você pode descobrir onde ele falha. Experimente apenas este comando:

echo "$LOGGER" | awk "/Send Command has completed Successfully/"

O que você ganha? Apenas a linha *** Send Command has completed Successfully . Então, é claro, dar uma cotovelada para a data não funciona; essa linha não contém uma data.

Se você quiser uma solução para o awk, tente algo como

echo "$LOGGER" | awk -vc="$currentdate" '
    /Send Command has completed Successfully/ { flag1=1 }
    $0 ~ c { flag2=1 }
END { if (flag1 && flag2) print "Yes"; else print "No" }'

que passa a variável do shell currentdate no awk como variável awk c e, em seguida, verifica se ele e a string "Enviar comando ..." ambos estão presentes na entrada.

E, a propósito,

  • Você deve sempre citar suas referências de variáveis de shell (por exemplo, "$currentdate" ) a menos que você tenha um bom motivo para não e você tem certeza de que sabe o que está fazendo. Seu comando grep … $currentdate nunca poderia ter funcionado sem aspas contanto que "$currentdate" tenha um espaço.
  • Se você quiser verificar se a entrada do registro é atual até a hora, você não deve usar %I em seu comando date - ele retorna a hora no intervalo 01..12. Então,

    • Se a entrada do registro for de 1AM (e, portanto, diz "%código%") e o horário atual é 1PM, sua variável 2017/04/18 01:##:## About to execute the following Send command:… será $currentdate e por isso vai dizer que a mensagem de 12 horas é atual, mas
    • se, como no seu exemplo, a entrada de log for de 13:00 (e, portanto, diz "%código%") e o horário atual é 1PM, sua variável 2017/04/18 01 será (novamente) 2017/04/18 13:05:32 About to execute the following Send command:… e por isso vai dizer que a mensagem atual não é atual.

    Você deve usar $currentdate , que varia (00..23).

por 19.04.2017 / 20:30
0

Editar: parece que você não tem certeza da ordem das datas no LOGGER, então mudei a minha entrada para coincidir com a data "em qualquer lugar"

Seu exemplo não mostra várias entradas, então presumo que sejam:

2017/04/....
(several lines)
*** Send Command has completed Successfully
2017/04/.... (another time, maybe before or after, no ordering )
(several lines)
2017/04/.... (another time, maybe before or after, no ordering )
(several lines)
2017/04/.... (another time, maybe before or after, no ordering )
(several lines)
2017/04/.... (another time, maybe before or after, no ordering )
(several lines)
*** Send Command has completed Successfully
2017/04/.... (another time, maybe before or after, no ordering )
(several lines)
2017/04/.... (another time, maybe before or after, no ordering )

Eu acredito que você só precisa:

dateappearsas="^[0-9][0-9][0-9][0-9]/[0-9][0-9]/"
looking_for="Send Command has completed Successfully"

echo "$LOGGER" \
| egrep -i "${dateappearsas}|${looking_for}" \
|  grep -i -B 1 "${looking_for}" \
| grep -A 1 "$currentdate"
returncode="$?" # in bash, gets the latest command in the preceding pipe, ie the grep's exit code
# the egrep: outputs all dates, and interspered among those some "successfully"
# the 2nd grep: transform those into pairs of date & successfully
# the last grep find only the matching currentdate and the line after it  
if [ "$returncode" = "0" ]
then
   echo "There is a transfer that matches the current date, AND was successful"
else
   echo "There is either no date matching the current date, or it wasn't successfull"
fi

Basicamente: egrep para obter o que você está procurando E o contexto (aqui: date). Dá talvez várias linhas de contexto, e alguns entre eles também têm a coisa que você está procurando. Então o grep -B 1 'what your are looking for' irá reagrupá-los: context / lookfor pairs juntos (juntando as linhas lookfor e a data anterior), e o último grep verificará se a data atual está entre esses pares

    
por 19.04.2017 / 19:56

Tags