Linux에서 grep 명령을 사용하는 방법

Linux grep명령은 여러 파일에서 일치하는 행을 표시하는 문자열 및 패턴 일치 유틸리티입니다. 또한 다른 명령의 파이프 된 출력에서도 작동합니다. 방법을 보여드립니다.

grep의 비하인드 스토리

grep명령은 Linux 및 Unix 서클에서 세 가지 이유로 유명합니다. 첫째, 매우 유용합니다. 둘째, 다양한 옵션이 압도적 일 수 있습니다. 셋째, 특정 요구를 충족시키기 위해 하룻밤 사이에 작성되었습니다. 처음 두 개는 강타입니다. 세 번째는 약간 떨어져 있습니다.

Ken Thompson은 ed편집기 (ee-dee라고 발음) 에서 정규식 검색 기능을 추출하고 텍스트 파일을 검색하기 위해 자신이 사용할 작은 프로그램을 만들었습니다. Bell Labs의 부서장 인 Doug Mcilroy는 Thompson에게 접근하여 그의 동료 인 Lee McMahon이 직면 한 문제를 설명했습니다.

McMahon은 텍스트 분석을 통해 연방주의 논문의 저자를 식별하려고했습니다. 그는 텍스트 파일 내에서 구문과 문자열을 검색 할 수있는 도구가 필요했습니다. Thompson은 그날 저녁에 그의 도구를 다른 사람들이 사용할 수있는 일반적인 유틸리티로 만들고 grep. 그는 '글로벌 정규식 검색'으로 번역되는 ed명령 문자열 에서 이름을 가져 왔습니다 g/re/p.

Thompson의 탄생에 대해 Brian Kernighan과 이야기하는 모습을 볼 수 있습니다 grep.

grep을 사용한 간단한 검색

파일 내에서 문자열을 검색하려면 명령 줄에 검색어와 파일 이름을 전달합니다.

일치하는 라인이 표시됩니다. 이 경우 한 줄입니다. 일치하는 텍스트가 강조 표시됩니다. 이는 대부분의 배포 grep에서 별칭 이 다음과 같기 때문입니다 .

alias grep = "grep --colour = auto"

일치하는 여러 줄이있는 결과를 살펴 보겠습니다. 응용 프로그램 로그 파일에서 "Average"라는 단어를 찾습니다. 로그 파일에서 단어가 소문자인지 기억할 수 없기 때문에 (대소 문자 -i 무시) 옵션을 사용합니다.

grep -i 평균 geek-1.log

일치하는 모든 줄이 표시되고 일치하는 텍스트가 각 줄에 강조 표시됩니다.

-v (일치 반전) 옵션을 사용하여 일치하지 않는 행을 표시 할 수 있습니다.

grep -v Mem geek-1.log

일치하지 않는 선이기 때문에 강조 표시가 없습니다.

우리는 grep완전히 침묵하게 만들 수 있습니다 . 결과는에서 반환 값으로 셸에 전달됩니다 grep. 결과가 0이면 문자열 발견 되었음을 의미하고 결과가 1이면 찾을 수 없음을 의미합니다 . $?특수 매개 변수를 사용하여 리턴 코드를 확인할 수 있습니다  .

grep -q 평균 geek-1.log
에코 $?
grep -q howtogeek geek-1.log
에코 $?

grep을 사용한 재귀 검색

중첩 된 디렉터리 및 하위 디렉터리를 검색하려면 -r (재귀) 옵션을 사용합니다. 명령 줄에 파일 이름을 제공하지 않고 경로를 제공해야합니다. 여기서는 현재 디렉토리“.”에서 검색합니다. 및 모든 하위 디렉토리 :

grep -r -i memfree.

출력에는 일치하는 각 행의 디렉토리와 파일 이름이 포함됩니다.

(재귀 역 참조) 옵션 grep  을 사용하여 심볼릭 링크를 따를 수 있습니다  -R. 이 디렉토리에는 logs-folder. 을 가리 킵니다 /home/dave/logs.

ls -l 로그 폴더

-R(재귀 역 참조) 옵션을 사용하여 마지막 검색을 반복 해 보겠습니다  .

grep -R -i memfree.

심볼릭 링크가 뒤 따르고 그것이 가리키는 디렉토리도 검색됩니다 grep.

전체 단어 검색

기본적으로 grep는 검색 대상이 다른 문자열 내부를 포함하여 해당 줄의 아무 곳에 나 나타나면 해당 줄과 일치합니다. 이 예를보세요. "무료"라는 단어를 검색하겠습니다.

grep -i 무료 geek-1.log

결과는 "free"문자열이 포함 된 줄이지 만 별도의 단어는 아닙니다. "MemFree"문자열의 일부입니다.

grep 별도의 "단어"만 일치 시키려면 -w(단어 정규식) 옵션을 사용하십시오 .

grep -w -i 무료 geek-1.log
에코 $?

이번에는 검색 용어 "free"가 별도의 단어로 파일에 나타나지 않기 때문에 결과가 없습니다.

여러 검색어 사용

-E(확장 정규 표현식) 옵션을 사용하면 여러 단어를 검색 할 수 있습니다. (이 -E옵션은 더 이상 사용되지 않는 egrep버전을 대체합니다 grep.)

이 명령어는 "average"와 "memfree"라는 두 개의 검색어를 검색합니다.

grep -E -w -i "평균 | memfree"geek-1.log

각 검색어에 대해 일치하는 모든 행이 표시됩니다.

전체 단어 일 필요는 없지만 전체 단어 일 수도있는 여러 용어를 검색 할 수도 있습니다.

-e(패턴) 옵션을 사용하면 명령 줄에서 여러 검색어를 사용할 수 있습니다. 검색 패턴을 만들기 위해 정규식 대괄호 기능을 사용하고 있습니다. grep대괄호 "[]"에 포함 된 문자 중 하나와 일치하도록 지시 합니다. 즉, grep검색 할 때 "kB"또는 "KB"와 일치합니다.

두 문자열이 모두 일치하며 실제로 일부 행에는 두 문자열이 모두 포함됩니다.

정확히 일치하는 라인

-x(라인 정규 표현식)에만 라인 일치 전체 라인은 검색어와 일치합니다. 로그 파일에 한 번만 나타나는 것으로 알고있는 날짜 및 시간 스탬프를 검색해 보겠습니다.

grep -x "20-Jan--06 15:24:35"geek-1.log

일치하는 단일 행을 찾아 표시합니다.

그 반대는 일치 하지 않는 선만 표시하는 것 입니다. 이는 구성 파일을 볼 때 유용 할 수 있습니다. 댓글은 훌륭하지만 때로는 모두에서 실제 설정을 찾기가 어렵습니다. /etc/sudoers파일 은 다음과 같습니다 .

다음과 같이 주석 줄을 효과적으로 필터링 할 수 있습니다.

sudo grep -v "#"/ etc / sudoers

파싱하기가 훨씬 쉽습니다.

일치하는 텍스트 만 표시

일치하는 전체 줄이 아니라 일치하는 텍스트 만보고 싶은 경우가있을 수 있습니다. -o(만 일치) 옵션은 그냥 않습니다.

grep -o MemFree geek-1.log

전체 일치하는 행이 아니라 검색어와 일치하는 텍스트 만 표시하도록 화면이 축소됩니다.

grep으로 계산

grep텍스트에 관한 것이 아니라 숫자 정보도 제공 할 수 있습니다. 우리는 grep여러 가지 방법으로 우리를 중요 하게 생각할 수 있습니다 . 파일에 검색어가 몇 번 나타나는지 알고 싶다면 -c(count) 옵션을 사용할 수 있습니다 .

grep -c 평균 geek-1.log

grep 검색 용어가이 파일에 240 번 나타납니다.

(줄 번호) 옵션 grep을 사용하여 일치하는 각 줄의 줄 번호를 표시 할 수 있습니다 -n.

grep -n Jan geek-1.log

일치하는 각 줄의 줄 번호는 줄의 시작 부분에 표시됩니다.

표시되는 결과 수를 줄이려면 -m(최대 개수) 옵션을 사용하십시오 . 출력을 5 개의 일치하는 행으로 제한합니다.

grep -m5 -n Jan geek-1.log

컨텍스트 추가

일치하는 각 줄에 대해 일부 추가 줄 (일치하지 않는 줄)을 볼 수 있으면 유용합니다. 관심있는 행이 일치하는 행을 구별하는 데 도움이 될 수 있습니다.

일치하는 줄 뒤에 몇 줄을 표시하려면 -A (문맥 뒤) 옵션을 사용합니다. 이 예에서는 세 줄을 요청합니다.

grep -A 3 -x "06 년 1 월 20 일 15:24:35"geek-1.log

일치하는 줄 앞의 일부 줄을 보려면 -B(앞에 컨텍스트) 옵션을 사용하십시오 .

grep -B 3 -x "06 년 1 월 20 일 15:24:35"geek-1.log

그리고 일치하는 줄 앞뒤의 줄을 포함하려면 -C(context) 옵션을 사용하십시오 .

grep -C 3 -x "06 년 1 월 20 일 15:24:35"geek-1.log

일치하는 파일 표시

검색어가 포함 된 파일의 이름을 보려면 -l (일치하는 파일) 옵션을 사용하십시오. sl.h헤더 파일에 대한 참조가 포함 된 C 소스 코드 파일을 찾으려면 다음 명령을 사용하십시오.

grep -l "sl.h"* .c

일치하는 행이 아니라 파일 이름이 나열됩니다.

물론 검색어가 포함되지 않은 파일을 찾을 수 있습니다. -L(일치하지 않고 파일) 옵션은 그냥 않습니다.

grep -L "sl.h"* .c

줄의 시작과 끝

grep행의 시작 또는 끝 부분에있는 일치 항목 만 표시 하도록 강제 할 수 있습니다 . "^"정규식 연산자는 줄의 시작과 일치합니다. 실제로 로그 파일 내의 모든 줄에는 공백이 포함되지만 첫 번째 문자로 공백이있는 줄을 검색합니다.

grep "^"geek-1.log

줄의 시작 부분에 첫 번째 문자로 공백이있는 줄이 표시됩니다.

줄의 끝을 일치 시키려면 "$"정규식 연산자를 사용하십시오. "00"으로 끝나는 줄을 검색합니다.

grep "00 $"geek-1.log

디스플레이에는 최종 문자가 "00"인 줄이 표시됩니다.

grep과 함께 파이프 사용

물론 입력을 grep으로 파이프하고 grep다른 프로그램 의 출력을 grep파이프하고 파이프 체인의 중간에 중첩 할 수 있습니다.

C 소스 코드 파일에서 "ExtractParameters"문자열의 모든 항목을보고 싶다고 가정 해 보겠습니다. 꽤 많을 것이라는 것을 알고 있으므로 출력을 less다음과 같이 파이프합니다 .

grep "ExtractParameters"* .c | 적게

출력은 less.

이렇게하면 파일 목록을 페이지로 넘기고 less's검색 기능 을 사용할 수 있습니다 .

출력을 grep로 파이프하고 (lines) 옵션을 wc사용하면 -l"ExtractParameters"가 포함 된 소스 코드 파일의 줄 수를 계산할 수 있습니다. ( grep-c(count) 옵션을 사용하여이 작업을 수행 할 수 있지만 이는에서 파이프를 보여주는 깔끔한 방법입니다 grep.)

grep "ExtractParameters"* .c | 화장실 -l

다음 명령으로, 우리는의 출력 배관하고 ls로를 grep으로부터의 출력을 파이프 grepsort. 현재 디렉토리에있는 파일을 나열하고 "Aug"문자열이있는 파일을 선택하고 파일 크기별로 정렬합니다.

ls -l | grep "8 월"| + 4n 정렬

그것을 분해 해보자 :

  • ls -l :를 사용하여 긴 형식의 파일 목록을 수행합니다 ls.
  • grep "Aug" : ls목록 에서 "Aug"가 있는 줄을 선택 합니다. 이름에 "Aug"가있는 파일도 찾습니다.
  • sort + 4n : 네 번째 열 (파일 크기)에서 grep의 출력을 정렬합니다.

우리는 파일 크기의 오름차순으로 8 월에 수정 된 모든 파일 (연도에 관계없이)의 정렬 된 목록을 얻습니다.

관련 : Linux에서 파이프를 사용하는 방법

grep : 적은 명령, 더 많은 동맹

grep귀하의 처분에 사용할 수있는 훌륭한 도구입니다. 그것은 1974 년에 시작되었고 우리는 그것이하는 일이 필요하기 때문에 여전히 강해지고 있습니다.

grep일부 정규 표현식과 결합 하면 실제로 다음 단계로 넘어갑니다.

관련 : 기본 정규식을 사용하여 더 나은 검색 및 시간 절약 방법