это больше не вариант 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,
задание для 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 ...
) для редактирования файла на месте Попробуйте эту команду
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-й столбец и посчитайте секунды. if(time_taken>60)
{напечатайте $5,$8,$18}
Мы используем отрицательный просмотр в регулярном выражении 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