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 일치는 string1
inside 와 일치 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.4
DenyAll
$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