O que está fazendo

O que está fazendo

Arquivo de entrada

Mar 19 06:10:16 ip-172-2-0-53 sendmail[28131]: v2JDA1k4028131: to=root, ctladdr=root (0/0), delay=00:00:15, xdelay=00:00:00, mailer=relay, pri=30580, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (v2JDAG5W028134 Message accepted for delivery)
Mar 19 14:41:26 ip-172-2-0-53 sendmail[29483]: v2JLfNFN029481: to=<[email protected]>,<[email protected]>, delay=00:00:03, xdelay=00:00:03, mailer=esmtp, pri=151738, relay=ifaded-com.mail.p...ction.outlook.com. [xx.xxx.x.x], dsn=2.0.0, stat=Sent (<[email protected]> [InternalId=31288836753166, Hostname=ERGsDGddssdD5.namprd07.prod.outlook.com] 8924 bytes in 0.309, 28.142 KB/sec Queued mail for delivery)
Mar 19 06:10:26 ip-172-2-0-53 sendmail[28131]: v2JDA1k4028131: to=root, ctladdr=root (0/0), delay=00:20:15, xdelay=00:00:00, mailer=relay, pri=30580, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (v2JDAG5W028134 Message accepted for delivery)

Eu tentei seguir o comando

 cat logh.txt | grep -E -o " delay=.[^,]*|^[^ip]+" 

eu quero descobrir os 5 principais tempos de atraso com data, como posso resolver esse problema com o comando llinux. estou recebendo o seguinte resultado

Mar 19 06:10:16
 delay=00:00:15
Mar 19 14:41:26
 delay=00:00:03
Mar 19 06:10:26
 delay=00:20:15

Saída desejada

  Mar 19 06:10:26 delay=00:20:15
  Mar 19 06:10:16 delay=00:00:15
  Mar 19 14:41:26 delay=00:00:03

Responder1

Você vai precisar de vários passes. Aqui está uma solução que usa sed, sorte headpara cutfornecer os 5 primeiros na ordem desejada.

sed -e 's/^\([A-Za-z]\{3\} \{1,2\}[0-9]\{1,2\} \{1,2\}\([0-9]\{2\}:\)\{2\}[0-9]\{2\}\).* \(delay=\([0-9]\{2\}\):\([0-9]\{2\}\):\([0-9]\{2\}\)\).*/\4\5\6 \1 \3/' | sort -nr | head -n5 | cut -d\  -f2-

Com a entrada fornecida, isso emite:

Mar 19 06:10:26 delay=00:20:15
Mar 19 06:10:16 delay=00:00:15
Mar 19 14:41:26 delay=00:00:03

(Supõe que sua entrada esteja no formato de log que você forneceu e que apenas linhas com os dados desejados sejam alimentadas. Um grep adicional no início pode ser necessário.)

O que está fazendo

Vamos decompô-lo.

sed

sedsignifica StreamEditor. É rotineiramente usado para aplicar expressões regulares a fluxos de texto.

expressão regular do sed

's/^\([A-Za-z]\{3\} \{1,2\}[0-9]\{1,2\} \{1,2\}\([0-9]\{2\}:\)\{2\}[0-9]\{2\}\).* \(delay=\([0-9]\{2\}\):\([0-9]\{2\}\):\([0-9]\{2\}\)\).*/\4\5\6 \1 \3/'

Isso é um bocado demais, mas precisa ser assim, para evitarretrocesso catastrófico.

Estamos usando substituições Regex. Para ver o que está fazendo em detalhes,tente Regex101. Por enquanto, saiba que é necessária a entrada:

Mar 19 06:10:16 ip-172-2-0-53 sendmail[28131]: v2JDA1k4028131: to=root, ctladdr=root (0/0), delay=00:00:15, xdelay=00:00:00, mailer=relay, pri=30580, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (v2JDAG5W028134 Message accepted for delivery)
Mar 19 14:41:26 ip-172-2-0-53 sendmail[29483]: v2JLfNFN029481: to=<[email protected]>,<[email protected]>, delay=00:00:03, xdelay=00:00:03, mailer=esmtp, pri=151738, relay=ifaded-com.mail.p...ction.outlook.com. [xx.xxx.x.x], dsn=2.0.0, stat=Sent (<[email protected]> [InternalId=31288836753166, Hostname=FOOBAR1.namprd07.prod.outlook.com] 8924 bytes in 0.309, 28.142 KB/sec Queued mail for delivery)
Mar 19 06:10:26 ip-172-2-0-53 sendmail[28131]: v2JDA1k4028131: to=root, ctladdr=root (0/0), delay=00:20:15, xdelay=00:00:00, mailer=relay, pri=30580, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (v2JDAG5W028134 Message accepted for delivery)

e converte-o em

000015 Mar 19 06:10:16 delay=00:00:15
000003 Mar 19 14:41:26 delay=00:00:03
002015 Mar 19 06:10:26 delay=00:20:15

correspondência sed regex

^\([A-Za-z]\{3\} \{1,2\}[0-9]\{1,2\} \{1,2\}\([0-9]\{2\}:\)\{2\}[0-9]\{2\}\).* \(delay=\([0-9]\{2\}\):\([0-9]\{2\}\):\([0-9]\{2\}\)\).*

Primeiro combinamos explicitamente os componentes de data; precisaremos deles para saída mais tarde. Em seguida, encontramos e combinamos o atraso e seus componentes de temporização individualmente; o atraso que você queria em sua saída. Os componentes de temporização serão necessários mais tarde, para classificação.

substituição de regex do sed

\4\5\6 \1 \3

No lado da substituição da regex, pegamos os componentes de tempo que pegamos e os concatenamos sem o delimitador ":" que eles tinham originalmente. Isso é importante, pois usaremos isso mais sorttarde. Após os componentes de temporização, anexamos a string de data e toda a string de atraso original; vamos querer eles depois de classificarmos.

organizar

sort -nr

Como nossa entrada agora começa com um número decimal em vez de um carimbo de data/hora, podemos usar sorto modo numérico de ', especificado com o -nsinalizador.

Por padrão, sortclassifica em ordem crescente, colocando os valores maiores no final. Como isso significaria processartodosda sortsaída de para encontrar os maiores valores N, usamos -ro sinalizador de classificação para reverter a ordem de saída; agora, os maiores valores serão exibidos primeiro e podemos, headem vez de `tail.

Nossa saída, neste ponto, é assim:

002015 Mar 19 06:10:26 delay=00:20:15
000015 Mar 19 06:10:16 delay=00:00:15
000003 Mar 19 14:41:26 delay=00:00:03

cabeça

head -n5

Neste ponto, nossa entrada terá primeiro os valores maiores e já sabemos que queremos os 5 valores maiores. Então usamos heado -nparâmetro para dizer headquantos valores queremos.

Como, neste exemplo, na verdade não temos mais de 5 valores, ainda obtemos toda a saída que alimentamos.

002015 Mar 19 06:10:26 delay=00:20:15
000015 Mar 19 06:10:16 delay=00:00:15
000003 Mar 19 14:41:26 delay=00:00:03

corte

cut -d\  -f2-

Como não precisamos mais dela, precisamos retirar a chave de classificação numérica que inserimos sedna primeira etapa. Para isso recorremos a cut, que nos permite escolher quais campos queremos de cada linha fornecida.

Usamos -do parâmetro cut para informar qual é nosso separador de campo, nosso delimitador. Como o separador de campos é um espaço em branco, precisamos escapar dele com \, nos dando -d\.

Da cutperspectiva de, isso divide a linha 002015 Mar 19 06:10:26 delay=00:20:15em 002015 Mar 19 06:10:26 delay=00:20:15.

Para especificar quais campos queremos, usamos -f. Como queremos todos os campos, exceto o primeiro, usamos -f2-, fornecendo a saída desejada:

Mar 19 06:10:26 delay=00:20:15
Mar 19 06:10:16 delay=00:00:15
Mar 19 14:41:26 delay=00:00:03

Responder2

perl -lane '
   print join $", /\sdelay=\K(\S+)(?=,)/, splice(@F, 0, 3), /\s\K(delay=\S+)(?=,)/;
' | sort -t: -k 1,1nr -k 2,2nr -k 3,3nr | cut -d\  -f2- | head -n 5

informação relacionada