Defina o parâmetro do comando sed por um intervalo de tempo

Defina o parâmetro do comando sed por um intervalo de tempo

Este é meu arquivo de log de amostra, onde gosto de extrair de um arquivo de log muito grande

2017-05-30 23:11:34,629 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.AuthenticationProviderImpl - Invoking auth agent [accountName=rene1 remoteAddress=STEDGE/172.16.8.3]
2017-05-30 23:11:14,638 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.AuthenticationProviderImpl - SSH: Failed login attempt on [172.16.8.1]. Username: "rene1".
2017-05-30 23:10:54,663 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.KeyboardInteractiveAuthentication - SSH: Sent SSH_MSG_USERAUTH_INFO_REQUEST (Password Authentication): 
2017-05-30 23:10:36,415 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.AuthenticationProviderImpl - User login attempt has been made from address /172.16.8.1:58222
2017-05-30 23:10:36,415 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.AuthenticationProviderImpl - Invoking config agent [accountName=rene1 remoteAddress=/172.16.8.1]
2017-05-30 23:10:36,446 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.AuthenticationProviderImpl - Config agent success [accountName=rene1 remoteAddress=/172.16.8.1]



Eu gostaria de extrair todo o pedaço de log 23:10:36para 23:11:34usar o sed, mas falhou. Eu tinha testado grepe awkmas não tinha esperança do resultado esperado. É apenas me dado o log ocorrido dentro do 23:10:36qual não é o resultado esperado. Este é o meu comando

sed -n '/23:10:36/,/23:11:34/p' stlog.txt



Alguém sabe como deixar isso funcionar? contém apenas hora sem data porque meu programa obterá apenas a hora atual do sistema e consultará a base de log apenas na hora atual do sistema.

Responder1

Posso ver dois problemas aqui: 1) o log parece estar na ordem inversa, 2) você tem várias linhas que correspondem ao padrão "final".

(Embora a linha final tenha 23:10:36.446, que é posterior a 23:10:36.415 na penúltima linha)

Com a ordem inversa, você só obtém as linhas correspondentes, 23:10:36pois sedcomeça a imprimir quando vê isso e continua até ver 23:11:34, o que não existe.

Inverter os padrões (como abaixo) pareceria uma solução, mas você ainda obteria apenas a primeira linha que corresponde ao padrão final, já que a impressão para quando esse padrão é visto pela primeira vez.

sed -n '/23:11:34/,/23:10:36/p' stlog.txt

Aqui está uma awksolução que deve ser capaz de solucionar esse problema:

awk -vstart="23:11:34" -vend="23:10:36" \
  '$0 ~ start {p=1} $0 ~ end {e=1} e && $0 !~ end {p=0} p' stlog.txt 

A variável pcontrola a impressão e é apagada somente após o padrão "final" ser visto ( eé 1)ea linha atual não corresponde mais a esse padrão.

informação relacionada