Я знаю, как grep и найти все строки в файле, которые содержат простую строку:

cat my_log.log | grep 'Completed 200 OK in'

Это возвращает результаты, подобные следующим:

various info... Completed 200 OK in 250ms various info...
various info... Completed 200 OK in 112ms various info...
various info... Completed 200 OK in 1000ms various info...
various info... Completed 200 OK in 6000ms various info...
various info... Completed 200 OK in 33ms various info...
various info... Completed 200 OK in 100ms various info...

Я хотел бы сделать еще один шаг и вернуть только те строки, в которых миллисекунды (мс) превышают 1000.

Это возможно с grep? Другие посты предлагают использовать sed, но мне любопытно, возможно ли это сделать с grep.

-1
Neil 29 Май 2019 в 20:10

2 ответа

Лучший ответ

< Сильный > Sure

Команда grep поставляется с опцией -E, которая включает расширенные регулярные выражения в вашем шаблоне.

Тогда вам просто нужно найти 4-значное значение с регулярным выражением [0-9]{4}

cat my_log.log | grep -E "Completed 200 OK in [0-9]{4}ms"

Если вам нужно 4 или более цифр, просто используйте диапазон {4,} вместо {4}

cat my_log.log | grep -E "Completed 200 OK in [0-9]{4,}ms"
1
Daniel 29 Май 2019 в 17:57

Правильный способ сделать это - использовать awk как для регулярного выражения, так и для арифметического сравнения, например, с GNU awk для 3-го аргумента для match ():

$ awk 'match($0,/Completed 200 OK in ([0-9]+)/,a) && (a[1] > 1000)' file
various info... Completed 200 OK in 6000ms various info...

$ awk 'match($0,/Completed 200 OK in ([0-9]+)/,a) && (a[1] >= 1000)' file
various info... Completed 200 OK in 1000ms various info...
various info... Completed 200 OK in 6000ms various info...

$ awk 'match($0,/Completed 200 OK in ([0-9]+)/,a) && (a[1] >= 112)' file
various info... Completed 200 OK in 250ms various info...
various info... Completed 200 OK in 112ms various info...
various info... Completed 200 OK in 1000ms various info...
various info... Completed 200 OK in 6000ms various info...

Или если у вас нет GNU awk, то с любым awk:

$ awk '{ms=$0} sub(/.*Completed 200 OK in /,"",ms) && (ms+0 > 1000)' file
various info... Completed 200 OK in 6000ms various info...
0
Ed Morton 30 Май 2019 в 01:06
56365528