Я знаю, как 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 ответа
< Сильный > 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"
Правильный способ сделать это - использовать 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...
Новые вопросы
linux
ВОПРОСЫ LINUX ДОЛЖНЫ БЫТЬ ПРОГРАММИРОВАНЫ. Используйте этот тег только в том случае, если ваш вопрос касается программирования с использованием API-интерфейсов Linux или специфичного для Linux поведения, а не только потому, что вы случайно запускаете свой код в Linux. Если вам нужна поддержка Linux, вы можете попробовать https://unix.stackexchange.com или сайт Stack Exchange конкретного дистрибутива Linux, например https://askubuntu.com или https://elementaryos.stackexchange.com/.