Получить конкретное слово и следующий текст

printf '%.s,\n' {1..100} >>file
0
31.03.2017, 12:09
4 ответа

это больше не вариант sed. вы должны проанализировать строку, где время 00:01:00, 00:10:00 или 01:00:07 для подсчета более 60 секунд.

Я придумал файл awk

 { result = "" ;
   for (i=1;i<=NF;i++) {
     if ( $i ~ /^delay=/ ) {
       s=split(substr($i,6) ,A,":") ;
       t=60*A[1]+A[2] ;
       #printf "%2d : %d mn (60x%s+%s) : %s\n",i,t,A[1],A[2],$i ;
       if ( !t  ) next ;
       result = $i ;
     }
     if ( $i ~ /^Hostname/ ) result = result $i ;

  }
  if ( result != "" ) print result ;
}

подсказка:

  • ( $i ~ /^foo/ ) сопоставить i-е поле с foo (^: начало шаблона )
  • split(substr($i,6) ,A,":") разделить часть H:M:S в массиве A
  • A = BC : объединить строку B и C в A

с сегодняшним образцом это дает (u — имя вашего файла, u.awk — файл, содержащий программу awk)

 awk -f u.awk u
delay=00:02:34, Hostname=BY1PR0701MB1752.namprd07.prod.gmail.com]
delay=00:01:17, Hostname=CY1PR07MB1448.namprd07.prod.googlemail.com]
delay=00:03:31,
2
28.01.2020, 02:19

задание для sed

sed -e 's|^.* \(delay=[^ ]*\) .*\(Hostname=[^ ]*\) .*$|\1 \2|'  file

, где

  • sed -e | .... л ... | ... r ... | ' говорят sed заменить левую часть правой частью.
  • ^. *. *. * $ образец выборки (. - любой символ, * любое число, sapce - пробел, $ - конец строки)
  • \ (delay = [^] * \) \ (Hostname = [^] * \) захватить шаблон с полем (и получить их пронумерованные)
  • \ 1 \ 2 заменить то, что мы нашли.

редактировать : избавиться от запятой

sed -e 's|^.* \(delay=[^,]*\), .*\(Hostname=[^ ]*\) .*$|\1 \2|' u

где

  • использовать -i ( sed -i -s ... ) для редактирования файла на месте
2
28.01.2020, 02:19

Попробуйте эту команду

awk '{split($8,a,/=|:/);time_taken=a[2]*3600+a[3]*60+a[4]+0;if(time_taken>60){print $5,$8,$18}}' your_file.txt
  • split($8,a,/=|:/); разделите 8-й столбец и посчитайте секунды.
  • сравните время с 60 секундами if(time_taken>60)
  • напечатайте результаты {напечатайте $5,$8,$18}
0
28.01.2020, 02:19

Мы используем отрицательный просмотр в регулярном выражении Perl, чтобы получить задержки > 1 мин.

perl -lane '
   BEGIN{
      $,=$";
      $dly=qr/\bdelay=(?!00:(?:00:[0-5][0-9]|01:00))(?:\d\d:\d\d:\d\d)(?=,)/;
   }
   /$dly/ and print /\b(?:Hostname|sendmail)\S+|$dly/g;
' yourfile

sed -e '
   # logic for selecting entries where delay > 1 min
   /[ ]delay=[0-9][0-9]:[0-9][0-9]:[0-9][0-9],/!d
   /[ ]delay=[0][0]:[0][0]:[0-5][0-9],/d
   /[ ]delay=[0][0]:[0][1]:[0][0],/d

   # we are here => delay > 1 min, now fish out the entries...
   s/^/\n\n/
      s/[ ]sendmail[^ ]*/\n&\n/;  s/\(\n\n.*\)\n\(.*\)\n/\2\1/
      s/[ ]delay=[^, ]*/\n&\n/;   s/\(\n\n.*\)\n\(.*\)\n/\2\1/
      s/[ ]Hostname=[^ ]*/\n&\n/; s/\(\n\n.*\)\n\(.*\)\n/\2\1/
   s/\n\n.*//;s/^\s*//
' yourfile

Вывод

sendmail[5857]: delay=00:02:34 Hostname=BY1PR0701MB1752.namprd07.prod.gmail.com]
sendmail[5478]: delay=00:01:17 Hostname=CY1PR07MB1448.namprd07.prod.googlemail.com]
sendmail[1295]: delay=00:03:31
0
28.01.2020, 02:19

Теги

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