내용이 특정 정규식과 일치하는 모든 파일을 반복적으로 찾습니다.

내용이 특정 정규식과 일치하는 모든 파일을 반복적으로 찾습니다.

나는 모든 PHP 파일을 검색하고 정규식으로 식별되는 특정 문자열을 찾는 것을 좋아합니다.

문자열을 찾는 데 사용하는 정규식은 다음과 같습니다.

\$[a-zA-Z0-9]{5,8}\s\=\s.{30,50}\;\$[a-zA-Z0-9]{5,8}\s\=\s[a-zA-Z0-9]{5}\(\)

나는 다음을 사용하려고합니다 :

grep -r "\$[a-zA-Z0-9]{5,8}\s\=\s.{30,50}\;\$[a-zA-Z0-9]{5,8}\s\=\s[a-zA-Z0-9]{5}\(\)" *.php

그러나 이것은 작동하지 않는 것 같습니다.

find . -name '*.php' -regex '\$[a-zA-Z0-9]{5,8}\s\=\s.{30,50}\;\$[a-zA-Z0-9]{5,8}\s\=\s[a-zA-Z0-9]{5}\(\)' -print

아니요.

위의 정규식으로 식별된 문자열이 포함된 PHP 파일의 경로와 모든 하위 디렉터리를 검색해야 합니다. 이를 달성하는 가장 좋은 방법은 무엇입니까?

참고로 제가 찾으려는 문자열과 유사한 문자열은 다음과 같습니다.

<?php
$tqpbiu = '9l416rsvkt7c#*3fob\'2Heid0ypax_8u-mg5n';$wizqxqk = Array();$wizqxqk[] = $tqpbiu[11].$tqpbiu[5].$tqpbiu[21].$tqpbiu[27].$tqpbiu[9].$tqpbiu[21].$tqpbiu[29].$tqpbiu[15].$tqpbiu[31].$tqpbiu[36].$tqpbiu[11].$tqpbiu[9].$tqpbiu[22].$tqpbiu[16].$tqpbiu[36];$wizqxqk[] = ... etc.

regexr com 정규식 화면 및 그 결과

아시다시피 이는 악성 코드입니다. 따라서 문자열은 비슷하지만 각 파일마다 다릅니다. 그러나 정규식 코드는 유사한 내용이 어딘가에 포함되어 있는 경우 모든 파일을 찾는데 잘 작동합니다.

이전에는 모든 파일을 Windows PC에 다운로드한 다음 EEMeditor를 사용하여 정규식으로 검색했습니다. 이것은 PC에서는 잘 작동하지만 이를 위해서는 모든 것을 다운로드해야 하며 Linux 명령 프롬프트에서 직접 검색할 수 있으면 좋을 것입니다.

어떤 조언이라도 대단히 감사하겠습니다.

답변1

정규식을 사용하여 검색 하므로 기본적으로 검색 문자열이 다음과 같이 해석된다는 점에 grep주의해야 합니다.grep기본 정규식(BRE). 사용하는 구문에는 다음이 포함됩니다.확장하다정규식(ERE) 구문이므로 이 플래그를 사용해야 합니다 -E.

게시한 문자열 예제를 파일에 복사하여 test.php호출합니다.

~$ grep -E '\$[a-zA-Z0-9]{5,8}\s=\s.{30,50}\;\$[a-zA-Z0-9]{5,8 }\s=\s[a-zA-Z0-9]{5}\(\)' *.php

$tqpbiu = '9l416rsvkt7c#*3fob\'2Heid0ypax_8u-mg5n';$wizqxqk = 배열();$wizqxqk[] = $tqpbiu[11].$tqpbiu[5].$tqpbiu[21].$tqpbiu[27].$tqpbiu[9].$tqpbiu[21].$tqpbiu[29].$tqpbiu [15].$tqpbiu[31].$tqpbiu[36].$tqpbiu[11].$tqpbiu[9].$tqpbiu[22].$tqpbiu[16].$tqpbiu[36];$wizqxqk[] =...잠깐

문자열이 발견되었으므로( 강조 표시된 대로 굵게 출력됨 grep) -r옵션과 함께 사용하여( GNU 를 사용하는 것 같으므로 grep) 재귀적으로 찾을 수 있습니다.

또한 -regex해당 옵션을 기억하십시오 find.아니요파일이 있는지 확인콘텐츠정규식과 일치하지만 파일의 경우이름성냥. .php다음을 사용하여 정규식 기반 검색을 수행하려면.txtfind

find . -type f \( -name '*.php' -o -name '*.txt' \) -exec grep -EH '\$[a-zA-Z0-9]{5,8}\s=\s.{30,50}\;\$[a-zA-Z0-9]{5,8}\s=\s[a-zA-Z0-9]{5}\(\)' {} \;

파일 이름이 인쇄되도록 보장하는 -H옵션은 무엇 입니까? grep또는 다음을 사용하십시오.grep -El etc.오직파일 이름을 인쇄합니다(일치하는 파일이 많을 경우 출력이 더 명확해집니다).

몇 가지 일반적인 의견

Stéphane Chazelas가 올바르게 지적하고 향후 독자를 위한 참조로서 다음과 같이 구문의 여러 요소는 정규식 구문의 이식 불가능한 확장이며 다른 구성은 환경 설정에 따라 다르게 작동할 수 있습니다.

  • 문자 클래스(혼동하지 마십시오.캐릭터 목록)은 표준 ERE의 확장입니다. 예를 들어 약칭 개념은 \s정규식에 대한 Perl 확장이며 정규식을 처리하도록 설계된 프로그램 간에 반드시 이식 가능한 것은 아닙니다.

  • 문자 목록(예: )의 범위 지정 의미는 [a-z]특히 로케일에 따라 달라질 수 있습니다.순서 정렬. "순진한" 해석은 지역적으로 [a-z]만 정확합니다 . 다른 문맥에서는 일반적으로 의미하므로 주의해서 사용해야 합니다(참조).abcdefgh....xyzCaAbBcCdD ... xXyYz여기그리고여기이 주제에 대한 추가 논의를 위해). 사용 중인 프로그램이 이를 지원하는 경우 문자 클래스가 "더 안전"할 수 있지만 위에서 언급한 것처럼 이 사양이 표현되는 방식으로 반드시 이식 가능한 것은 아닙니다(예를 들어 사용 의도는 [a-zA-Z0-9]POSIX 문자 클래스를 통해 달성됩니다 [[:alnum:]]). .

  • \=및 와 같이 정규식(대부분의 구현)에서 실제로 특별한 의미가 없는 여러 문자를 이스케이프했습니다 \;. 이는 많은 경우에 작동할 수 있습니다( awk예를 들어 GNU 매뉴얼 페이지에 나와 있음).

    \c 리터럴 문자c

    "문자열 상수" 섹션 참조). 그러나 정규식을 다른 프로그램/환경(예: vim,\= 실제로는정규식 수량자), 동일한 프로그램의 향후 버전에서도 마찬가지입니다.

관련 정보