grep의 정규 표현식

grep의 정규 표현식

여기에 다음 명령이 있습니다.

grep -B10 -A10 '14:14:50 {"channels":["/alerts/6979/new"],"data":"New alerts for unit 6979"}' mygateway.log

14:14:50을 검색하는 대신 50을 임의의 숫자로 바꾸고 싶습니다. 그래서 저는 "."를 사용하여 정규 표현식의 모든 문자를 표현하고 싶습니다. 그러나 프로그래밍 언어에서는 일반적으로 정규식을 \abc.xyz\로 참조합니다. 여기서 "." 임의의 문자 및 임의 개수의 문자가 될 수 있습니다. 하지만 위의 grep 문자열에서 "."을 사용하면 반환 값이 제공되지 않습니다.

답변1

여기서 문제는 이 단어가 .어떤 의미로도 사용된다는 것입니다.하나의특징. 따라서 in은 일치 .하지만 일치하는 항목이 없으므로 나머지 줄은 일치하지 않습니다. 무슨 일이 있어도 당신이 찾고 있는 것이 무엇인지 알고 있기 때문에5500숫자, 정규식을 더 구체적으로 작성해야 합니다. 숫자를 다음과 대조해 보세요:

[0-9]\+

숫자에 선택적 소수 부분(소수점 뒤)이 있을 수 있다는 것을 알고 있는 경우 다음을 사용할 수 있습니다.

[0-9]\+\(\.[0-9]\+\)?

's(PCRE) 옵션을 사용하는 경우 +및 대괄호 앞의 백슬래시를 생략해야 합니다.grep-P

이 옵션을 사용할 계획이라면 -PPOSIX와 호환되지 않으며 모든 플랫폼에서 작동하지 않을 수 있다는 점을 알아야 합니다.

답변2

-P이 플래그를 사용하여 Perl 호환 정규식을 활성화하고 다음을 사용할 수도 있습니다 \d.

grep -P -B10 -A10 '14:14:\d+ {"channels":["/alerts/6979/new"],"data":"New alerts for unit 6979"}' mygateway.log

제한 사항을 줄여 실제로 단순화할 수도 있습니다(세부 사항은 물론 입력 데이터에 따라 다르지만 이것이 작동해야 함).

grep -P -B10 -A10 '14:14:\d+.*channels.*alerts/6979/new.*data.*New' mygateway.log

/alerts/6979/new/행이 둘 다 일치 하면 New나머지는 변경되지 않은 것으로 가정합니다 .

관련 정보