양식의 각 항목이 포함된 .log 파일이 있습니다.
2018-09-28T10:53:48,006 [Jetty-6152 ] INFO [correlationId] my.package.service:570 - Inbound request: 1.2.3.4 - GET - 12342ms - 200 - /json/some/resource
2018-09-28T11:53:48,006 [Jetty-6152 ] INFO [correlationId] my.package.service:570 - Inbound request: 1.2.3.4 - GET - 204ms - 200 - /json/other/resource
요청에 5초 이상 걸린 항목을 모두 찾으려면 어떻게 해야 합니까? 항목에 "[numberGreaterThan5000]ms"라는 텍스트가 포함되어 있습니까?
답변1
나는 이것이 다음과 같아야 한다고 생각합니다.
grep -E '([5-9][0-9]{3}|[0-9]{5,})ms' | grep -v 5000ms
어떻게 작동하나요?
- 사용되는
-E
정규식 은 "현대적인" 형식(확장이라고도 함)입니다. 우리의 경우 일부 문자를 저장할 수 있으므로 입력이 더 쉬워집니다\
. (...|...)ms
문자열 다음에 두 가지 대안을 검색합니다ms
. 정규식은 숫자를 비교할 수 없기 때문에 이것이 필요합니다. 그래서 나는 그런 말을 할 수 없습니다>= 5000
.- 첫 번째 옵션은
[5-9][0-9]{3}
5~9 사이의 숫자로 시작하고 그 뒤에 0~9 사이의 숫자가 3번 나타나는 문자열을 일치시키는 것입니다. 숫자는 >= 5000 및 < 10000입니다. - 두 번째 옵션은 5자리 이상의 문자열, 즉 10000보다 큰 숫자와 일치합니다.
- 마지막 으로 결과를 파이프하여
grep -v 5000ms
모든 발생을 필터링합니다.5000ms
더 큰5000보다 큽니다. 보다 크거나 같으면 값을 무시하십시오.
어디서 더 자세히 알아볼 수 있나요?
읽고 .man 1 grep
man 7 regex
답변2
일반적으로 정규식에서 숫자 비교를 작성하는 것을 피해야 합니다. 실제 숫자 비교를 수행하려면 awk
or 와 같은 것을 사용하십시오.perl
gawk -v x=5000 'match($0,/([0-9]+)ms/,a) && a[1]+0 > x' file.log
또는
perl -ne 'print if /(\d+)ms/ && $1 > 5000' file.log