grep으로 고정 문자열을 찾는 방법은 무엇입니까?

grep으로 고정 문자열을 찾는 방법은 무엇입니까?

grep원하는 출력이 표시되지 않으면 어떻게 고정 문자열을 찾을 수 있습니까 grep -F? 예를 들어:

egrep -r 'string1|string2|string3' /var/www/http

이것으로 우리는 무엇을 사용해야합니까?

답변1

grep -E(의 현대적인 형태 egrep)를 사용하면 |확장 정규 표현식으로 처리됩니다.번갈아연산자이지만 다른 모든 정규식 연산자(예: ., ?, *, ^, $, \, [, (, ), ) 를 이스케이프해야 합니다 {.}고정 문자열.

또는 -F한 줄에 하나 이상의 문자열을 사용하고 전달하십시오 -e.

grep -Fe string1 -e string2 -e string3

또는:

grep -F 'string1
string2
string3'

-x이러한 고정 문자열이 (어디서나 발견되지 않고) 전체 일치 행을 구성해야 하는 경우 이 옵션을 추가하십시오.이내에해당 행이 없습니다.) 대부분의 구현에는 다음 옵션 grep도 있습니다.-w단어예를 들어, where 일치는 string1inside 와 일치 foo string1-2하지만 inside 와 일치하지 않습니다 foostring12.

의견의 구체적인 예는 다음과 같습니다.

grep -wE 'Allow from (8\.8\.2\.5|192\.3\.0\.4)|DenyAll'

또는:

grep -we 'Allow from 8.8.2.5' -e 'Allow from 192.3.0.4' -e 'DenyAll'

-w또는 여기를 사용해야 합니다 -x(주위에 공백이 없어도 전체 줄이라고 가정). 그렇지 않으면 와 같은 줄도 일치합니다 Allow from 8.8.2.51.

다음과 같이 작성할 수도 있습니다.

grep -xE '[[:space:]]*(Allow from (8\.8\.2\.5|192\.3\.0\.4)|DenyAll)[[:space:]]*'

전체 줄( -x)과 일치하지만 선행 및 후행 공백 문자를 허용합니다. [[:space:]]대신 여기를 사용하면 [[:blank:]]MS-DOS 세계에서 줄 끝에 있는 CR 문자도 허용됩니다.

주석 내부가 아닌 행의 어느 곳에서나 이러한 고정 문자열을 찾으려면 이러한 고정 문자열로 이어지는 행 부분에 문자가 포함되어 있지 않은지 확인해야 합니다 #. 그래서 이렇게 :

grep -wE '^[^#]*(Allow from (8\.8\.2\.5|192\.3\.0\.4)|DenyAll)'

일치하는 문자열 전체에 적용되므로 -w적용되지 않습니다 . Allow예를 들어 와 일치합니다 GAllow from. 일부 grep구현 \<에서는 \>일치하도록 지원합니다.단어 경계명시적으로(특정이라고도 함 \b):

grep -E '^[^#]*\<(Allow from (8\.8\.2\.5|192\.3\.0\.4)|DenyAll)\>'

또한 에서는 apache2구성 지시문이 대소문자를 구분하지 않으며 단어 사이에 공백이 허용됩니다. 또한, Deny from all대신을 의미한다고 생각하므로 DenyAll다음을 원할 수도 있습니다.

grep -iE '^[^#]*\<(allow[[:blank:]]+from[[:blank:]]+(8\.8\.2\.5|192\.3\.0\.4)|deny[[:blank:]]+from[[:blank:]]+all)\>'

답변2

문제는

grep -F -r 'string1|string2|string3' /var/www/http

string1|string2|string3파일에서 텍스트 문자열을 찾을 수 있습니다. 고정된 문자열을 찾고 있으므로 egrep(또는 grep -E)를 사용할 이유가 없습니다.

당신이 할 수있는 것은 사용하는 것뿐입니다

printf '%s\n' 'string1' 'string2' 'string3' | grep -f /dev/stdin -F -r /var/www/http

이렇게 하면 grep고정 문자열이 표준 입력(제공)에서 읽혀지고 printf이를 사용하여 지정된 디렉터리의 모든 파일에서 일치하는 모든 줄을 가져옵니다.

별도의 줄 패턴으로 텍스트 문서를 생성하는 모든 항목은 printf간단한 텍스트 파일( 에서 직접 읽을 수 있음 grep -f textfile -F ...)을 포함하여 위의 내용을 대체할 수 있습니다.


귀하의 의견의 예:

다음 파일에서 문자열을 찾고 다음을 수행 합니다 Allow from 8.8.2.5.Allow from 192.3.0.4DenyAll$dirpath

printf '%s\n' 'Allow from 8.8.2.5' 'Allow from 192.3.0.4' 'DenyAll' |
grep -f /dev/stdin -F -r "$dirpath"

답변3

파이프는 다음과 같이 이스케이프 |되어야 합니다 \|.

grep 'string1\|string2\|string3\' /var/www/http

관련 정보