일부는 다음과 grep --help
같습니다:
-E, --extended-regexp PATTERNS are extended regular expressions
-F, --fixed-strings PATTERNS are strings
온라인에 많은 예가 있지만 -E
찾을 수 없습니다.-F
저는 정규식을 잘 다루지 못하고 가능하면 사용하지 않으려고 노력하므로 이것이 -F
더 나은 선택인 것 같았습니다.
객체에 3개의 다른 문자열이 포함되어 있는지 확인하기 위해 grep을 사용하는 구문은 무엇입니까?
답변1
지적했듯이 정규식 엔진을 선택 -F
하거나 비활성화하고 리터럴 문자열을 검색하십시오. --fixed-string
유효한 정규식이지만 의미가 다른 문자열을 찾는 데 유용합니다. 예를 들어:
grep -Fe '[warn]' app.log
패턴 [warn]
은 유효한 기본 정규식( BRE
)이므로 이 -F
옵션이 없으면 , 또는 중 하나 이상을 포함하는 모든 행이 grep
검색되고 캡처됩니다 . (괄호는 셸에서도 특별하므로 명령줄에서 인용해야 합니다.)w
a
r
n
[err]
예를 들어, 아래와 같이 로그 파일에서 다음과 같은 줄(따라서 표시된 줄 ) 이 포함된 오류 메시지를 찾고 싶다고 가정해 보겠습니다 .
[info] terrace lights on
[err] garage door control not responding
를 사용하면 grep 'err'
"t"라는 단어가 이 두 줄과 일치합니다.잘ace". grep '[err]'
는 둘 다 "e"(및 "r")를 갖기 때문에 이 두 줄과도 일치합니다. 그러나 여기서는 grep -F '[err]'
일치 항목을 태그로만 제한하는 쉬운 방법입니다. (또는 다음을 사용할 수도 있습니다. 대괄호: grep -e '\[err\]'
또는 grep -e '[[]err[]]'
심지어 일치하고 이스케이프하는 기본 정규식 grep '[[]err]'
이지만 이는 더 추악합니다.
검색할 패턴이 더 많은 경우 -e
이 옵션을 여러 번 사용할 수 있습니다.
grep -F -e '[warn]' -e '[debug]' -e '[err]' app.log
라인 매칭어느(적어도 하나)의 패턴이 일치합니다.
-x
, 옵션은 --line-regex
전체 줄이 패턴과 일치하는 경우에만 줄이 일치하는 것으로 간주된다는 의미이므로 이 경우에도 유용합니다. 예를 들어 grep -x foo
행이 이면 일치 foo
하지만 행이 이면 일치하지 않습니다 foobar
. 그리고 -Fx
함께 사용하면 포함된 특수 문자에 관계없이 정확히 일치하는 줄만 찾습니다.
답변2
test.txt
하나 이상의 문자열을 포함하는 행을 얻으려면 hello
다음을 goodbye
사용할 수 있습니다.
grep -F -e hello -e goodbye test.txt
즉, 찾아야 할 패턴이 options에 대한 인수로 제공되고 -e
옵션 -F
은 이를 고정 문자열로 처리하라는 지시를 받습니다. 글쎄, 이것은 위와 아무 관련이 없지만 예를 들어 이와 같은 패턴은 점, 별표 및 a를 a.*b
찾고 정규식 해석 대신 및 그 사이의 모든 것이 될 것입니다.a
b
a
b
또는 찾고 있는 문자열을 한 줄에 하나씩 파일에 넣고 -f
이 옵션을 사용하여 파일 이름을 지정할 수 있습니다.
$ grep -F -f patterns.txt test.txt
you say hello when you arrive
goodbye when you leave
but rarely say hello and goodbye at the same time
("주어진 모든 문자열" 테스트를 수행하는 것이 훨씬 어렵다는 점에 유의하십시오. 정규식을 사용하더라도 이는 꽤 어색합니다.)