grep을 사용하여 패턴, 파일 및 디렉토리를 제외하는 방법
게시 됨: 2022-06-29
1974년부터 Linux grep
명령은 사람들이 파일에서 문자열을 찾는 데 도움이 되었습니다. 그러나 때때로 grep
은 너무 철저합니다. 다음은 grep
에 다른 것을 무시하도록 지시하는 몇 가지 방법입니다.
grep 명령
grep
명령은 명령줄에 제공한 검색 패턴과 일치하는 문자열을 찾는 텍스트 파일을 검색합니다. grep
의 장점은 정규 표현식을 사용하는 데 있습니다. 이를 통해 명시적으로 정의할 필요 없이 찾고 있는 것을 설명할 수 있습니다.
grep
의 탄생은 Linux보다 먼저 등장했습니다. 1970년대 초 Unix에서 개발되었습니다. ed
라인 편집기의 g/re/p 키 시퀀스에서 이름을 가져옵니다(추가로 "ee-dee"로 발음됨). 이것은 g lobal, regular express search , print matching lines의 약자입니다.
grep
은 아마도, 악명 높게, 철저하고 한결같은 것으로 유명합니다. 때로는 시간을 낭비하지 않기를 원하는 파일이나 디렉토리를 검색할 것입니다. 결과가 나무에 대한 나무를 볼 수 없도록 할 수 있기 때문입니다.
물론 grep을 지배하는 방법이 있습니다. grep이 검색을 더 빨리 완료하고 의미 없는 오탐지로 휩쓸리지 않도록 패턴, 파일 및 디렉토리를 무시하도록 지시할 수 있습니다.
패턴 제외
grep
으로 검색하려면 cat
과 같은 다른 프로세스에서 입력을 파이프하거나 마지막 명령줄 매개변수로 파일 이름을 제공할 수 있습니다.
우리는 Lewis Carroll의 시 Jabberwocky 의 텍스트가 포함된 짧은 파일을 사용하고 있습니다. 이 두 가지 예에서 "Jabberwock" 검색어와 일치하는 행을 검색합니다.
고양이 jabberwocky.txt | grep "재버워크"
grep "Jabberwock" jabberwocky.text
검색 단서와 일치하는 항목이 포함된 행이 나열되며 각 행의 일치하는 요소는 빨간색으로 강조 표시됩니다. 바로 검색입니다. 그러나 "Jabberwock"이라는 단어가 포함된 행을 제외하고 나머지를 인쇄하려면 어떻게 해야 합니까?
-v
(일치 반전) 옵션을 사용하여 이를 수행할 수 있습니다. 검색어와 일치하지 않는 행이 나열됩니다.
grep -v "Jabberwock" jabberwocky.text
"Jabberwock"을 포함하지 않는 행은 터미널 창에 나열됩니다.
원하는 만큼 용어를 제외할 수 있습니다. "Jabberwock"이 포함된 줄과 "and"가 포함된 줄을 필터링해 보겠습니다. 이를 달성하기 위해 -e
(표현식) 옵션을 사용합니다. 우리가 사용하는 각 검색 패턴에 대해 사용해야 합니다.
grep -v -e "Jabberwock" -e "및" jabberwocky.txt
출력의 줄 수가 해당하는 감소합니다.
-E
(extended regexes) 옵션을 사용하면 검색 패턴을 " |
", 이 컨텍스트에서 파이프를 나타내지 않는 것은 논리적 OR
연산자입니다.
grep -Ev "Jabberwock|및" jabberwocky.txt
이전의 더 긴 명령으로 수행한 것과 정확히 동일한 출력을 얻습니다.
명시적 검색 단서 대신 정규식 패턴을 사용하려는 경우 명령 형식은 동일합니다. 이 명령은 "ACHT" 집합에서 문자로 시작하는 모든 줄을 제외합니다.
grep -Ev "^ACHT" jabberwocky.txt
패턴을 포함하지만 다른 패턴을 포함하지 않는 행을 보려면 grep
을 grep
으로 파이프할 수 있습니다. "Jabberwock"이라는 단어가 포함된 모든 줄을 검색한 다음 "slain"이라는 단어 도 포함하는 모든 줄을 필터링합니다.
grep "재버워크" jabberwocky.txt | grep -v "죽임"

파일 제외
파일 모음에서 문자열이나 패턴을 찾도록 grep
에 요청할 수 있습니다. 명령줄에 각 파일을 나열할 수 있지만 접근 방식이 확장되지 않는 많은 파일이 있습니다.
grep "vorpal" 절-1.txt 절-2.txt 절-3.txt 절-4.txt 절-5.txt 절-6.txt
일치하는 줄을 포함하는 파일의 이름은 출력의 각 줄 시작 부분에 표시됩니다.
타이핑을 줄이기 위해 와일드카드를 사용할 수 있습니다. 그러나 그것은 반직관적일 수 있습니다. 이것은 작동하는 것으로 보입니다.
grep "vorpal" *.txt
그러나 이 디렉토리에는 시와 아무 관련이 없는 다른 TXT 파일이 있습니다. 동일한 명령 구조로 "sword"라는 단어를 검색하면 많은 오탐지가 발생합니다.
grep "검" *.txt
우리가 원하는 결과는 TXT 확장자를 가진 다른 파일의 잘못된 결과로 인해 가려집니다.
"vorpal"이라는 단어는 일치하지 않지만 "sword"는 "password"라는 단어에 포함되어 일부 의사 로그 파일에서 여러 번 발견되었습니다.
이러한 파일을 제외해야 합니다. 이를 위해 --exclude
옵션을 사용합니다. "vol-log-1.txt"라는 단일 파일을 제외하려면 다음 명령을 사용합니다.
grep --exclude=vol-log-1.txt "검" *.txt
이 경우 이름이 "vol"로 시작하는 여러 로그 파일을 제외하려고 합니다. 필요한 구문은 다음과 같습니다.
grep --exclude=vol*.txt "검" *.txt
-R
(역참조-재귀) 옵션을 사용하면 grep
이 전체 디렉토리 트리를 검색합니다. 기본적으로 해당 위치의 모든 파일을 검색합니다. 제외하려는 파일 유형이 여러 개 있을 수 있습니다.
이 테스트 시스템의 현재 디렉토리 아래에는 로그 파일, CSV 파일 및 MD 파일이 포함된 중첩된 디렉토리가 있습니다. 이것들은 우리가 제외하려는 모든 유형의 텍스트 파일입니다. 각 파일 유형에 --exclude
옵션을 사용할 수 있지만 파일 유형을 그룹화하여 원하는 것을 보다 효율적으로 달성할 수 있습니다.
이 명령은 CSV 또는 MD 확장자가 있는 모든 파일과 이름이 "vol" 또는 "log"로 시작하는 모든 TXT 파일을 제외합니다.
grep -R --exclude=*.{csv,md} --exclude={vol*,log*}.txt "검" /home/dave/data/
디렉토리 제외
무시하려는 파일이 디렉토리에 포함되어 있고 검색하려는 디렉토리에 파일이 없으면 전체 디렉토리를 제외할 수 있습니다.
개념은 --exclude-dir
옵션을 사용하고 무시할 디렉토리 이름을 지정한다는 점을 제외하면 파일 제외의 개념과 매우 유사합니다.
grep -R --exclude-dir=backup "vorpal" /home/dave/data
"backup" 디렉토리를 제외했지만 여전히 "backup2"라는 다른 디렉토리를 검색하고 있습니다.
단일 명령에서 --exclude-dir
옵션을 여러 번 사용할 수 있다는 것은 놀라운 일이 아닙니다. 제외된 디렉토리의 경로는 검색이 시작될 디렉토리를 기준으로 지정해야 합니다. 파일 시스템의 루트에서 절대 경로를 사용하지 마십시오.
grep -R --exclude-dir=backup --exclude-dir=backup2 "vorpal" /home/dave/data
그룹화도 사용할 수 있습니다. 다음을 사용하여 동일한 것을 더 간결하게 달성할 수 있습니다.
grep -R --exclude-dir={백업, 백업2} "보팔" /home/dave/data
동일한 명령에서 파일 및 디렉터리 제외를 결합할 수 있습니다. 디렉토리에서 모든 파일을 제외하고 검색 되는 디렉토리에서 특정 파일 유형을 제외하려면 다음 구문을 사용하십시오.
grep -R --exclude=*.{csv,md} --exclude-dir=backup/archive "악의적인" /home/dave/data
때때로 그것은 당신이 남기는 것입니다.
때때로 grep
을 사용하면 건초 더미에서 바늘을 찾는 것처럼 느껴질 수 있습니다. 건초 더미를 제거하는 것은 큰 차이를 만듭니다.
관련: Linux에서 정규식(regexes)을 사용하는 방법