정규식이 아닌 Grep


96

PHP 변수를 검색해야합니다 $someVar. 그러나 Grep은 내가 정규식을 실행하려고하고 불평하고 있다고 생각합니다.

$ grep -ir "Something Here" * | grep $someVar
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.
$ grep -ir "Something Here" * | grep "$someVar"
<<Here it returns all rows with "someVar", not only those with "$someVar">>

grep에게 문자열을 정규식으로 해석 하지 않고$ 다른 문자열 문자로 포함하도록 지시 하는 옵션이 표시되지 않습니다 .


3
이 질문에서 주요 문제는 정규식으로 grep해석 $하는 것이 아닙니다 . $someVar환경 변수의 값으로 대체하는 쉘에 관한 someVar것입니다. 아마도 빈 문자열입니다. 두 번째 예는 someVar빈 문자열이 모든 행에 있기 때문에 모든 행을 제외한 모든 행을 반환해서는 안됩니다 . 쉘이 대체하지 않도록 지시하려면 '$someVar'또는 을 사용해야 \$someVar합니다. 그런 다음 캐릭터 의 grep해석 을 처리해야합니다 $.
Christophe Drevet-Droguet

1
@ ChristopheDrevet-Droguet : 설명 해주셔서 감사합니다, 저는 반대표에 대해 당황했습니다! 귀하의 의견은 답변이 될만큼 충분히 유익합니다. 실제로 그렇다면 페이지에서 더 나은 답변 중 하나가 될 것입니다.
dotancohen

답변:



299

fgrep(더 이상 사용 되지 않음) grep -F또는 grep --fixed-strings을 사용하여 패턴을 정규식 대신 고정 문자열 목록으로 처리합니다.

참고로 문서에는 다음이 언급되어 있습니다 (발췌).

-F --fixed-strings패턴을 개행으로 구분 된 고정 문자열 (정규 표현식 대신) 목록으로 해석합니다. (-F는 POSIX에 의해 지정됩니다.)

fgrep와 동일합니다 grep -F. fgrep과 같은 직접 호출은 더 이상 사용되지 않지만이를 사용하는 히스토리 애플리케이션이 수정되지 않은 상태로 실행될 수 있도록 제공됩니다.

전체 참조를 보려면 https://www.gnu.org/savannah-checkouts/gnu/grep/manual/grep.html을 확인하십시오.


간단한 좋은 대답입니다.
breadmj

동의합니다. 변수를 사용할 때 addslashes()bash에서 PHP와 같은 작업을 수행 할 수 없습니다 . 이것이 가장 간단한 방법입니다.
geerlingguy

1
감사합니다. 알림 : 큰 따옴표를 사용하는 경우, 당신은 여전히해야합니다 탈출$ : 예를 grep -FR "unset(\$foo['bar'])", 그렇지 않으면 그것은 외부 변수의 생각과 시도가 그것을 확장,
aexl

57

grep -Fgrep인수를 패턴이 아닌 고정 된 문자열로 해석 하도록 지시하는 표준 방법 입니다.


1
진지하게, 이것은 받아 들여진 대답이어야했습니다!
ankush981

좋은 대답입니다. ssh 명령을 사용하여 $로 문자열을 검색 할 때 내 문제가 해결되었습니다. 이 시나리오에서는 "\"로 이스케이프 처리되지 않았습니다. 그러나 -F 플래그가 트릭을 수행했습니다.
Rajasekhar 2015-08-28

8

grep에게 '-F'를 사용하여 패턴 대신 고정 문자열을 사용하도록 알려야합니다.

grep -ir "Something Here" * | grep -F \$somevar

3

이 질문에서 주요 문제는 정규식으로 grep해석 $하는 것이 아닙니다 . $someVar환경 변수의 값으로 대체하는 쉘에 관한 것 입니다.someVar 것입니다. 아마도 빈 문자열입니다.

따라서 첫 번째 예에서는 grep인수없이 호출하는 것과 같 으며 이것이 usage출력을 제공하는 이유 입니다. 두 번째 예는 someVar빈 문자열이 모든 행에 있기 때문에 모든 행을 제외한 모든 행을 반환해서는 안됩니다 .

쉘이 대체하지 않도록 지시하려면 '$someVar'또는 을 사용해야 \$someVar합니다. 그런 다음 $캐릭터 의 grep 해석을 처리해야 하므로grep -F 다른 많은 답변에 제공된 옵션이 있습니다.

따라서 유효한 대답은 다음과 같습니다.

grep -ir "Something Here" * | grep '$someVar'

2

-F옵션에 +1 하면 수락 된 답변이됩니다. 를 검색하는 동안 또한, 나는 "이상한"행동을했다 -I..같이, 내 파일에서 패턴 -I의 옵션으로 간주되었다 grep; 이러한 종류의 오류를 방지하기 위해를 사용하여 명령의 인수 끝을 명시 적으로 지정할 수 있습니다 --.

예:

grep -HnrF -- <pattern> <files>

누군가를 도울 수 있기를 바랍니다.


F는 무엇을 의미합니까?
Arnold Roa

From gnu.org/software/grep/manual/grep.html : "-F : 패턴을 고정 문자열 (정규 표현식 대신) 목록으로 해석하고 개행 문자로 구분하여 일치시킬 수 있습니다. (-F POSIX에 의해 지정됩니다.) "
Aloïké Go

사용하는 경우 생략 ---HnrF수 있습니까?
Daniel

@Daniel 그것은 당신이하고 싶은 것에 달려 있습니다 : -F패턴을 정규 표현식으로 --해석 하는 것을 피하고 그 뒤에 오는 요소를 grep의 옵션으로 해석 하는 것을 피합니다.
Aloïké 이동

@ AloïkéGo 감사합니다.
Daniel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.