Grep для значения в строке более x миллисекунд - PullRequest
0 голосов
/ 29 мая 2019

Я знаю, как 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.

Ответы [ 2 ]

1 голос
/ 29 мая 2019

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"
0 голосов
/ 30 мая 2019

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

$ 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...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...