grep에서 별표 기호 사용


87

Linux / bash의 특정 파일에서 "abc"하위 문자열을 검색하려고합니다.

그래서 나는 :

grep '*abc*' myFile

아무것도 반환하지 않습니다.

하지만 내가 할 경우 :

grep 'abc' myFile

일치를 올바르게 반환합니다.

자, 이것은 나에게 문제가 아닙니다. 하지만 더 복잡한 문자열을 grep하려면 어떻게해야합니까?

*abc * def *

grep을 사용하여 어떻게 수행합니까?


3
grep 자체는 대부분의 플랫폼에서 와일드 카드를 지원하지 않습니다. 와일드 카드를 사용하려면 egrep을 사용해야합니다. 셸에는 다른 구문이 있습니다. 쉘의 "*"는 <모든 문자열>입니다. egrep에서는 "이전 엔터티의 대부분에 0"이라고 말하는 연산자입니다. grep에서는 일반 문자 일뿐입니다.
PanCrit

@PanCrit : *grep과 egrep에서 동일한 것을 의미합니다. 이것은 0 개 이상의 선행 원자를 의미 하는 수량 자 입니다. 이것은 쉘에서 사용 하는 와일드 카드 와는 완전히 다른 개념 입니다.
앨런 무어

답변:


123

별표는 반복 연산자 일 뿐이지 만 반복하는 내용을 알려야합니다. /*abc*/ab와 0 개 이상의 c를 포함하는 문자열과 일치합니다 (두 번째 *는 c에 있기 때문에 첫 번째는 반복 할 것이 없기 때문에 의미가 없습니다). 무엇이든 일치 .*시키려면 점은 모든 문자를 의미합니다 ( 특정 지침 내에서 ). abc 만 일치 시키려면라고 말할 수 있습니다 grep 'abc' myFile. 더 복잡한 경기를 위해서는 다음을 사용해야합니다 .*.grep 'abc.*def' myFile 하여 abc 다음에 def가 포함 된 문자열을 선택적으로 그 사이에있는 항목과 일치 .

댓글에 따라 업데이트 :

*정규식에서 콘솔의 *와 정확히 동일하지 않습니다. 콘솔에서 *는 glob 구조의 일부이며 와일드 카드 역할을합니다 (예를 들어 ls *.log.log로 끝나는 모든 파일을 나열합니다). 그러나 정규식에서 *는 수정 자이며, 이는 앞에 오는 문자 또는 그룹에만 적용됨을 의미합니다. 정규식에서 *를 와일드 카드로 사용하려면 .*앞서 언급 한대로 사용해야 합니다. 점은 와일드 카드 문자이고 점을 수정할 때 별표는 하나 이상의 점을 찾는 것을 의미합니다. 즉. 하나 이상의 문자를 찾습니다.


1
질문자가 쉘 와일드 카드와 정규 표현식의 차이점에 대해 혼란스러워한다고 생각합니다. 나는 또한 더 복잡한 표현이 다음과 같을 것이라고 생각한다 : grep 'abc. * def'(적어도 하나의 공간이 있음-아마도 내가 쓴대로 두 개).
Jonathan Leffler

1
실제로 질문자는 'abc'가 '^ abc $'와 같은 것이 아님을 이해하지 못하는 것 같습니다. :-D
Massa

1
예, 저는 glob과 전체 정규 표현식을 혼동했습니다. 나는 점없이 *를 사용하여 쉘의 모든 것과 일치한다는 것을 의미합니다.
Saobi

1
grep *은 "0 개 이상"을 의미하며 grep은 기본적으로 탐욕 스럽습니다. 그렙에 있습니다 기본적인 정규 표현식 메타 문자는 ?, +, {, |, (, 그리고 )그들의 특별한 의미를 잃게됩니다. 추가 정보 : grep regexps
KrisWebDev

24

점 문자는 모든 문자와 일치 함을 의미하므로 모든 문자가 .*0 개 이상 발생 함을 의미합니다. 당신은 아마 사용하는 의미 .*만이 아니라 *.


Dot은 새 줄을 제외한 모든 문자를 허용하는 메타 문자입니다 .
Abhishek Kamal

12

"별표"는 앞에 무언가가있을 때만 의미가 있습니다. 도구가 없으면 (이 경우 grep) 오류로 처리 할 수 ​​있습니다. 예를 들면 :

'*xyz'    is meaningless
'a*xyz'   means zero or more occurrences of 'a' followed by xyz

5
*는 의미가 없습니다. 일반적인 의미 (반복)가 아니라 "나는 스타 다"라는 뜻입니다. 별표 뒤에 x, y, z가있는 행과 일치합니다.
Jonathan Leffler

2
@Jonathan 도구에 따라 다릅니다.


6

예를 들어 Linux의 셸 명령 줄에서 작동하는 식과 같이 시도한 식을 " glob " 이라고합니다 . Glob 표현식은 grep이 찾을 문자열을 지정하는 데 사용하는 완전한 정규 표현식이 아닙니다 . 여기 차이점에 대한 (오래된 작은) 포스트입니다. glob 표현식 ( "ls *"에서와 같이)은 쉘 자체에서 해석됩니다.

glob에서 RE로 변환하는 것이 가능하지만 일반적으로 머리 속에서 그렇게해야합니다.


1
셸에서 구문 분석 한 경우에만 glob입니다. 그가 작은 따옴표 안에 검색 문자열을 보존하고 있기 때문에 쉘은 문자열을 그대로두고 argv에서 grep에 그대로 전달했습니다.
눈에 띄는 컴파일러

4

정규식을 사용하지 않으므로 선택한 grep 변형은이어야하며 fgrep예상대로 작동합니다.


2
fgrep이제 더 이상 사용되지 않으므로 grep -f대신 사용해야합니다.
프로 메테우스

1
그것은 "grep -F"입니다. Good ol 'fgrep은 "사용되지 않음"일 수 있지만 내가 아직 살아있는 동안에는 제거하지 않을 것입니다.
앤드류 빌스


1

이것은 당신이 찾고있는 대답 일 수 있습니다 :

grep abc MyFile | grep def

유일한 것은 ... 출력 라인이 "def"가 "abc"앞 또는 뒤에 있다는 것입니다.


1

이것은 나를 위해 일했습니다.

grep ". * $ {expr}"-점이 앞에 오는 큰 따옴표 포함. 여기서 "expr"은 줄 끝에 필요한 문자열입니다.

추가 스위치가없는 표준 유닉스 grep.


0

'*'는 이전 항목의 수정 자로 작동합니다. 따라서 'abc * def'는 'ab'다음에 0 개 이상의 'c'를 'def'로 검색합니다.

아마도 원하는 것은 'abc. * def'로 'abc'와 그 뒤에 'def'가 나오는 문자를 검색합니다.

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