1974년부터 리눅스 grep
명령은 사람들이 파일에서 문자열을 찾는 데 도움이 되었습니다. 하지만 가끔은 grep
너무 철저합니다. 다음은 여러 가지 방법으로 grep
다른 것을 무시하는 것.
grep 명령
그만큼 grep
명령은 명령줄에 제공한 검색 패턴과 일치하는 문자열을 찾는 텍스트 파일을 검색합니다. 의 힘 grep
정규 표현식의 사용에 있습니다. 이를 통해 명시적으로 정의할 필요 없이 찾고 있는 것을 설명할 수 있습니다.
의 탄생 grep
리눅스보다 앞선다. 1970년대 초 Unix에서 개발되었습니다. g/re/p 키 시퀀스에서 이름을 가져옵니다. ed
라인 편집기(추가로 “ee-dee”라고 발음함). 이것은 g현지, 답장일반 익스프레스 검색, 피린트 일치 라인.
grep
유명하게도, 아마도 악명 높게도, 철저하고 독단적입니다. 때로는 시간을 낭비하지 않기를 원하는 파일이나 디렉토리를 검색할 것입니다. 결과가 나무를 위한 나무를 볼 수 없도록 할 수 있기 때문입니다.
물론 grep을 지배하는 방법이 있습니다. grep이 검색을 더 빨리 완료하고 의미 없는 오탐지로 휩쓸리지 않도록 패턴, 파일 및 디렉토리를 무시하도록 지시할 수 있습니다.
패턴 제외
로 검색하려면 grep
다음과 같은 다른 프로세스에서 입력을 파이프할 수 있습니다. cat
또는 파일 이름을 마지막 명령줄 매개변수로 제공할 수 있습니다.
우리는 시의 텍스트가 포함된 짧은 파일을 사용하고 있습니다. 재버워키, 루이스 캐롤. 이 두 가지 예에서 “Jabberwock” 검색어와 일치하는 행을 검색합니다.
cat jabberwocky.txt | grep "Jabberwock"
grep "Jabberwock" jabberwocky.text
검색 단서와 일치하는 행이 나열되며 각 행의 일치하는 요소가 빨간색으로 강조 표시됩니다. 바로 검색입니다. 그러나 “Jabberwock”이라는 단어가 포함된 행을 제외하고 나머지를 인쇄하려면 어떻게 해야 합니까?
우리는 그것을 달성할 수 있습니다 -v
(반전 일치) 옵션. 검색어와 일치하지 않는 행이 나열됩니다.
grep -v "Jabberwock" jabberwocky.text
“Jabberwock”을 포함하지 않는 행은 터미널 창에 나열됩니다.
원하는 만큼 용어를 제외할 수 있습니다. “Jabberwock”이 포함된 줄과 “and”가 포함된 줄을 필터링해 보겠습니다. 이를 달성하기 위해 우리는 -e
(표현) 옵션. 우리가 사용하는 각 검색 패턴에 대해 사용해야 합니다.
grep -v -e "Jabberwock" -e "and" jabberwocky.txt
출력의 줄 수가 해당하는 감소합니다.
우리가 사용하는 경우 -E
(extended regexes) 옵션을 사용하면 검색 패턴을 “|
“, 이 컨텍스트에서 파이프를 나타내지 않는 것은 논리적 OR
운영자.
grep -Ev "Jabberwock|and" jabberwocky.txt
이전의 더 긴 명령으로 수행한 것과 정확히 동일한 출력을 얻습니다.
명시적 검색 단서 대신 정규식 패턴을 사용하려는 경우 명령 형식은 동일합니다. 이 명령은 “ACHT” 집합에서 문자로 시작하는 모든 줄을 제외합니다.
grep -Ev "^ACHT" jabberwocky.txt
패턴을 포함하지만 다른 패턴을 포함하지 않는 라인을 보려면 다음을 파이프할 수 있습니다. grep
~ 안으로 grep
. “Jabberwock”이라는 단어가 포함된 모든 줄을 검색한 다음 또한 “살인”이라는 단어가 포함되어 있습니다.
grep "Jabberwock" jabberwocky.txt | grep -v "slain"
파일 제외
우리는 물어볼 수 있습니다 grep
파일 모음에서 문자열이나 패턴을 찾습니다. 명령줄에 각 파일을 나열할 수 있지만 접근 방식이 확장되지 않는 많은 파일이 있습니다.
grep "vorpal" verse-1.txt verse-2.txt verse-3.txt verse-4.txt verse-5.txt verse-6.txt
일치하는 줄을 포함하는 파일의 이름은 출력의 각 줄 시작 부분에 표시됩니다.
타이핑을 줄이기 위해 와일드카드를 사용할 수 있습니다. 그러나 그것은 반직관적일 수 있습니다. 이것은 작동하는 것으로 보입니다.
grep "vorpal" *.txt
그러나 이 디렉토리에는 시와 아무 관련이 없는 다른 TXT 파일이 있습니다. 동일한 명령 구조로 “sword”라는 단어를 검색하면 많은 오탐지가 발생합니다.
grep "sword" *.txt
우리가 원하는 결과는 TXT 확장자를 가진 다른 파일의 잘못된 결과로 인해 가려집니다.
“vorpal”이라는 단어는 일치하지 않지만 “sword”는 “password”라는 단어에 포함되어 일부 의사 로그 파일에서 여러 번 발견되었습니다.
이러한 파일을 제외해야 합니다. 이를 위해 우리는 다음을 사용할 것입니다 --exclude
옵션. “vol-log-1.txt”라는 단일 파일을 제외하려면 다음 명령을 사용합니다.
grep --exclude=vol-log-1.txt "sword" *.txt
이 경우 이름이 “vol”로 시작하는 여러 로그 파일을 제외하려고 합니다. 필요한 구문은 다음과 같습니다.
grep --exclude=vol*.txt "sword" *.txt
우리가 사용할 때 -R
(역참조-재귀) 옵션 grep
우리를 위해 전체 디렉토리 트리를 검색합니다. 기본적으로 해당 위치의 모든 파일을 검색합니다. 제외하려는 파일 유형이 여러 개 있을 수 있습니다.
이 테스트 시스템의 현재 디렉토리 아래에는 로그 파일, CSV 파일 및 MD 파일이 포함된 중첩된 디렉토리가 있습니다. 이것들은 우리가 제외하려는 모든 유형의 텍스트 파일입니다. 우리는 사용할 수 있습니다 --exclude
각 파일 유형에 대한 옵션을 제공하지만 파일 유형을 그룹화하여 보다 효율적으로 원하는 것을 얻을 수 있습니다.
이 명령은 CSV 또는 MD 확장자가 있는 모든 파일과 이름이 “vol” 또는 “log”로 시작하는 모든 TXT 파일을 제외합니다.
grep -R --exclude=*.{csv,md} --exclude={vol*,log*}.txt "sword" /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={backup,backup2} "vorpal" /home/dave/data
동일한 명령에서 파일 및 디렉터리 제외를 결합할 수 있습니다. 디렉토리에서 모든 파일을 제외하고 해당 디렉토리에서 특정 파일 유형을 제외하려면 ~이다 검색하려면 다음 구문을 사용하십시오.
grep -R --exclude=*.{csv,md} --exclude-dir=backup/archive "frumious" /home/dave/data
때때로 그것은 당신이 남기는 것입니다.
때로는 함께 grep
건초더미에서 바늘을 찾는 것처럼 느껴질 수 있습니다. 건초 더미를 제거하는 것은 큰 차이를 만듭니다.
관련된: Linux에서 정규식(regexes)을 사용하는 방법