2014-10-10 3 views
5

나는 특정 단어를 스캔하려고하는 큰 로그 파일을 가지고있다. 일반적으로 큰 로그 파일에서 grep해야 할 단어가 거의없고 그 단어가 들어있는 줄을 인쇄합니다.로그 파일에 특정 단어를 포함하는 행에 대해 grep하는 방법은 무엇입니까?

나는 파일에 간단한 grep을하는 방법을 안다. 내 파일 이름이 abc.log이고 "hello"라는 단어가 포함 된 줄을 찾으려면 항상 이렇게하고 나에게 줄을 인쇄하십시오.

grep -i "hello" abc.log 

그러나 단어 조합에 대해 grep을 수행하는 방법을 모르겠습니다. 의미있는 단어 목록을 가지면 모든 단어에 대해 abc.log 파일을 스캔하고 개별적으로 해당 단어가 포함 된 행을 인쇄합니다.

#!/bin/bash 

data="hello,world,tester" 

# find all the lines which contains word hello or world or tester 

그래서 내 위의 쉘 스크립트에서 내 데이터 변수를 분할하고 그래서 안녕하세요 단어가 포함 된 모든 행을 abc.log 안녕 단어를 보면, 나뿐만 아니라 세계와 테스터와 마찬가지로 그것을 밖으로 인쇄됩니다.

로그를 그릴 실제 논리를 건드리지 않고 데이터 변수에 내 단어 목록을 추가하기 만하면됩니다.

답변

6

당신이 파일에 패턴을 저장하는 경우, 한 줄에 하나씩, 당신은 그 사람의 페이지에서 grep -f file-with-patterns file-to-search.log

를 사용할 수 있습니다

-f FILE, --file=FILE 
      Obtain patterns from FILE, one per line. The empty file 
      contains zero patterns, and therefore matches nothing. (-f is 
      specified by POSIX.) 
+0

감사 o11c. 필자의 경우 패턴이 많이 커지므로 파일 접근 방식이 좋지만 한 가지 더 추가하고 싶습니다. 특정 단어가 포함되어 있으면 줄을 인쇄하지 마십시오. 현재 접근 방식으로 어떻게이 작업을 수행합니까? – john

+0

@ user2809564'grep -v wordtoexclude' (또는'-e' 또는'-f' 등)를 통해 첫번째 grep을 파이프하십시오. – o11c

+0

고마워요. 제외 할 패턴이 여러 개있을 수도 있으므로 제외하고 패턴을 포함하는 파일 하나를 만들어이 파일을 사용하여 grep을 수행하는 방법이 있습니까? – john

6

나는 다음과 같이 정규 표현식을 사용 :

grep -E 'hello|world|tester' abc.log 
+0

감사합니다. bruchowski. 그것은 잘 작동합니다. 제 경우에는 3 가지 이상의 패턴을 가질 수 있습니다. 그래서 질문에 표시 한 것과 같이 변수에 저장 한 다음 그 변수를 분리하여 그레이핑을 시작하거나 파일에 저장하는 것처럼 생각했습니다. 쉘 스크립트에서이 generic을 만드는 더 좋은 방법이 있다고 생각합니까? – john

+0

@ user2809564 명령 줄 인수의 길이에 제한이 있기 때문에이 방법은 파일 하나가없는 곳에는 결국 실패합니다. 귀하의 데이터 세트가 * 큰지 여부는 확실하지 않습니다. – o11c

+0

@ user2809564 어느 쪽이든 좋은 접근 방법입니다. 검색 할 문자열이 너무 많다는 계획이 없다면이 인라인 방식을 사용하여'|'에 검색어 배열을 추가 할 수 있습니다. 그렇지 않으면 @ o11c의 대답이 나에게 잘 맞을 것입니다 – bruchowski

0

bruchowski's answer 외에도 다음을 사용할 수도 있습니다.

grep -i -e "hello" -e "world" -e "tester" abc.log 

또는

grep 'hello\|world\|tester' abc.log 

또는

egrep 'hello|world|tester' abc.log 
관련 문제