Извлечение 2 дат из файла журнала с определенными шаблонами и сравнение 2 дат

Я мало что знаю о правилах Apache, так что, вероятно, это перебор. Однако, если слишком много экранирования не является проблемой, вы можете использовать:

$ perl -ne 'print quotemeta()' file
RewriteRule\ \^\/trendy\/the\-reason\-for\-example\ http\:\/\/www\.example\.com\/trendy\/the\-reason\ \[NC\,\ L\,\ R\=301\]\
RewriteRule\ \^\/lol\/2015\/10\.\.\._for\-example\ http\:\/\/www\.example\.com\/lol\/the\-reason\ \[NC\,\ L\,\ R\=301\]\
RewriteRule\ \^\/sports\/this\-one\*\*\*\-as\-well\ http\:\/\/www\.example\.com\/sports\/this\-one\ \[NC\,\ L\,\ R\=301\]\
RewriteRule\ \^\/buzz\/the\-\#reason\-for\-buzz\ http\:\/\/www\.example\.com\/buzz\/buzz\-sells\ \[NC\,\ L\,\ R\=301\]\
RewriteRule\ \^\/omg\/\ what\-the\-hell\ http\:\/\/www\.example\.com\/omg\/wthell\ \[NC\,\ L\,\ R\=301\]\
RewriteRule\ \^\/hash\/HELL\-YEAH\ http\:\/\/www\.example\.com\/hash\/oh\-yes\ \[NC\,\ L\,\ R\=301\]\
RewriteRule\ \^\/celeb\/he\-did\-it\!\ http\:\/\/www\.example\.com\/celeb\/we\-believe\ \[NC\,\ L\,\ R\=301\]\

В противном случае, чтобы экранировать только определенные символы, которые вы упомянули, используйте:

$ sed 's#[*.#!]#\\&#g' file
RewriteRule\ ^/trendy/the-reason-for-example\ http://www\.example\.com/trendy/the-reason\ [NC,\ L,\ R=301]
RewriteRule\ ^/lol/2015/10\.\.\._for-example\ http://www\.example\.com/lol/the-reason\ [NC,\ L,\ R=301]
RewriteRule\ ^/sports/this-one\*\*\*-as-well\ http://www\.example\.com/sports/this-one\ [NC,\ L,\ R=301]
RewriteRule\ ^/buzz/the-\#reason-for-buzz\ http://www\.example\.com/buzz/buzz-sells\ [NC,\ L,\ R=301]
RewriteRule\ ^/omg/\ what-the-hell\ http://www\.example\.com/omg/wthell\ [NC,\ L,\ R=301]
RewriteRule\ ^/hash/HELL-YEAH\ http://www\.example\.com/hash/oh-yes\ [NC,\ L,\ R=301]
RewriteRule\ ^/celeb/he-did-it\!\ http://www\.example\.com/celeb/we-believe\ [NC,\ L,\ R=301]

Чтобы сделать то же самое, но только во втором поле, используйте:

$ perl -lne '/(.+\^)(.*)( http.*)/; ($k,$l,$m)=($1,$2,$3); $l=~s/[ *.#!]/\\$&/g; print "$k$l$m";' file
RewriteRule ^/trendy/the-reason-for-example http://www.example.com/trendy/the-reason [NC, L, R=301]
RewriteRule ^/lol/2015/10\.\.\._for-example http://www.example.com/lol/the-reason [NC, L, R=301]
RewriteRule ^/sports/this-one\*\*\*-as-well http://www.example.com/sports/this-one [NC, L, R=301]
RewriteRule ^/buzz/the-\#reason-for-buzz http://www.example.com/buzz/buzz-sells [NC, L, R=301]
RewriteRule ^/omg/\ what-the-hell http://www.example.com/omg/wthell [NC, L, R=301]
RewriteRule ^/hash/HELL-YEAH http://www.example.com/hash/oh-yes [NC, L, R=301]
RewriteRule ^/celeb/he-did-it\! http://www.example.com/celeb/we-believe [NC, L, R=301]
0
16.05.2018, 12:51
2 ответа

Я бы подошёл к этому с помощью awk-скрипта, приведенного ниже. Скрипт ищет строки «получение» и «получено». Типичным случаем является то, что он сначала находит «полученную» строку, а затем «полученную» строку; если «полученная» строка будет найдена первой, d1будет сброшено или равно нулю, поэтому о ней не будет сообщено. В противном случае мы извлекаем основную часть даты (перед запятой ), преобразуем ее в секунды -с -эпохи -, а затем снова добавляем миллисекунды. Это значение сохраняется в d1.

Как только «полученная» строка видна, ее дата вычисляется таким же образом, затем мы проверяем разницу; если это более 2 секунд, мы сообщаем об этом. В любом случае, мы затем сбрасываем d1, чтобы начать процесс заново.

Сохраните приведенное ниже в скрипт, назовите его как хотите (возможно alert-jdbc.awk), затем запустите его с помощью awk -f alert-jdbc.awk < log-file-here.

Сценарию требуется утилита даты GNU для преобразования произвольных дат.

/DEBUG Obtaining JDBC connection/ {
  split($1 " " $2, dates, /,/)
  "date -d \"" dates[1]"\" +%s" | getline seconds
  d1=seconds + dates[2]/1000
}

/DEBUG Obtained JDBC connection/ {
  if (d1) {
    split($1 " " $2, dates, /,/)
    "date -d \"" dates[1]"\" +%s" | getline seconds
    d2=seconds + dates[2]/1000
    if (d2 - d1 > 2) {
        print "More than 2 seconds for: " $0
    }
    d1=0
  }
}
2
28.01.2020, 02:18

Prueba esto:

Delay=$(( 
  ($(date -d "`awk '/DEBUG Obtained JDBC connection/{print $1" "$2}' file.log |
  cut -d ',' -f1 | tail -n1`" +%s)) -
  ($(date -d "`awk '/DEBUG Obtaining JDBC connection/{print $1" "$2}' file.log |
  cut -d ',' -f1 | tail -n1`" +%s)) ))
echo "$Delay Sec"

explicará el comando si funciona para sus necesidades.

2
28.01.2020, 02:18

Теги

Похожие вопросы