Linux 에서 grep 으로 텍스트 검색하기

CompTIABeginner
지금 연습하기

소개

이 실습에서는 강력한 grep 명령어를 사용하여 Linux 시스템의 파일 내에서 텍스트를 효과적으로 검색하는 방법을 배웁니다. 먼저 단일 파일 및 여러 파일에서 특정 문자열을 찾는 기본적인 검색 방법부터 시작하여, grep이 일치하는 행을 표시하는 방식과 여러 위치를 검색할 때 소스 파일을 식별하는 방법을 이해하게 됩니다.

이러한 기초를 바탕으로 검색 결과를 정교하게 다듬을 수 있는 고급 기능을 살펴봅니다. 문맥 파악을 위해 행 번호를 표시하는 방법, 행의 시작이나 끝에서 패턴을 일치시키기 위해 ^$와 같은 앵커를 사용하는 방법, 그리고 복잡하고 유연한 패턴 매칭을 수행하기 위해 기본 및 확장 정규 표현식의 기능을 활용하는 방법을 학습합니다.

이 실습은 학습과 연습을 돕기 위해 단계별 지침을 제공하는 가이드 실습입니다. 각 단계를 완료하고 실무 경험을 쌓으려면 지침을 주의 깊게 따르십시오. 통계 데이터에 따르면 이 실습은 초급 수준이며 완료율은 96%입니다. 학습자들로부터 100%의 긍정적인 평가를 받았습니다.

파일에서 기본 검색 수행하기

이 단계에서는 파일 내에서 기본적인 검색을 수행하기 위한 grep 명령어의 근본적인 사용법을 배웁니다. grep(Global Regular Expression Print) 명령어는 하나 이상의 파일에서 특정 문자열이나 패턴을 검색하고 해당 내용을 포함하는 행을 출력하는 데 사용되는 강력한 명령줄 도구입니다.

grep의 기본 구문은 grep PATTERN [FILE...]입니다.

먼저 간단한 작업부터 시작해 보겠습니다. 시스템의 사용자 데이터베이스 파일에서 현재 사용자인 labex에 대한 정보를 찾아보겠습니다. 이 정보는 /etc/passwd 파일에 저장되어 있습니다.

터미널에서 다음 명령어를 실행하여 /etc/passwd 파일에서 labex 문자열이 포함된 행을 찾으십시오.

grep labex /etc/passwd

사용자 이름인 labex가 포함된 파일의 출력 행이 표시되어야 합니다.

labex:x:5000:5000::/home/labex:/usr/bin/zsh

grep 명령어는 여러 파일에서 동시에 검색할 수도 있습니다. 이제 세 개의 중요한 시스템 설정 파일인 /etc/passwd, /etc/shadow(보안 사용자 계정 정보 저장), /etc/group(사용자 그룹 정의) 에서 labex 문자열을 검색해 보겠습니다.

/etc/shadow 파일에는 민감한 정보가 포함되어 있으므로 이를 읽으려면 관리자 권한이 필요합니다. sudo 명령어를 사용하여 이러한 권한으로 grep을 실행할 수 있습니다. labex 사용자는 비밀번호 없는 sudo 권한이 설정되어 있습니다.

세 파일 모두에서 labex를 검색하려면 다음 명령어를 실행하십시오.

sudo grep labex /etc/passwd /etc/shadow /etc/group

여러 파일에서 검색할 때 grep은 일치하는 항목이 발견된 파일의 이름을 각 행 앞에 접두사로 붙인다는 점에 유의하십시오.

/etc/passwd:labex:x:5000:5000::/home/labex:/usr/bin/zsh
/etc/shadow:labex:$y$j9T$L6UYJUCu2XytrdFToEOw.1$yp2xAOVTbIPmbABMnS/xDsyce7xayU80JgIs3lrqw4B:20265:0:99999:7:::
/etc/group:sudo:x:27:labex
/etc/group:ssl-cert:x:121:labex
/etc/group:labex:x:5000:
/etc/group:public:x:5002:labex

이를 통해 세 파일 전체에서 사용자 labex와 관련된 모든 행을 확인할 수 있습니다.

-n 옵션으로 행 번호 표시하기

이 단계에서는 일치하는 항목이 발견된 행 번호를 표시하여 grep의 출력을 강화하는 방법을 배웁니다. 이는 편집이나 추가 분석을 위해 대용량 파일 내에서 패턴의 위치를 찾아야 할 때 특히 유용합니다. -n 옵션은 grep이 출력의 각 행 앞에 입력 파일의 해당 행 번호를 붙이도록 지시합니다.

이전 단계의 명령어를 바탕으로 실습해 보겠습니다. 세 개의 시스템 파일에서 사용자 labex를 검색했습니다. 이제 동일한 검색을 수행하되 각 일치 항목에 대한 행 번호도 함께 표시해 보겠습니다.

이전 단계에서 실행한 명령어에 -n 옵션을 추가하십시오. 여전히 접근이 제한된 /etc/shadow 파일에 접근하므로 sudo를 사용해야 함을 잊지 마십시오.

터미널에서 다음 명령어를 실행하십시오.

sudo grep -n labex /etc/passwd /etc/shadow /etc/group

이전과 유사한 출력이 표시되지만, 이제 각 행 앞에 파일 이름과 일치 항목이 발생한 행 번호가 콜론으로 구분되어 표시됩니다.

/etc/passwd:32:labex:x:5000:5000::/home/labex:/usr/bin/zsh
/etc/shadow:32:labex:$y$j9T$L6UYJUCu2XytrdFToEOw.1$yp2xAOVTbIPmbABMnS/xDsyce7xayU80JgIs3lrqw4B:20265:0:99999:7:::
/etc/group:21:sudo:x:27:labex
/etc/group:60:ssl-cert:x:121:labex
/etc/group:61:labex:x:5000:
/etc/group:62:public:x:5002:labex

출력에서 32, 32, 21, 60, 61, 62와 같은 숫자를 확인하십시오. 이것이 행 번호입니다. 예를 들어, labex 문자열은 /etc/passwd 파일의 32 행과 /etc/shadow 파일의 32 행에서 발견되었습니다. 이 간단한 옵션 덕분에 grep은 파일 내용을 탐색하고 이해하는 데 더욱 효과적인 도구가 됩니다.

^ 및 $ 앵커를 이용한 행 위치 매칭

이 단계에서는 앵커를 사용하는 방법을 배워 grep 기술을 한 단계 더 발전시킵니다. 앵커는 정규 표현식에서 문자가 아닌 행 내의 위치를 일치시키는 특수 문자입니다. 이를 통해 더욱 구체적이고 강력한 검색 패턴을 만들 수 있습니다. 가장 일반적인 두 가지 앵커는 다음과 같습니다.

  • ^ (캐럿): 행의 시작 부분과 일치합니다.
  • $ (달러 기호): 행의 끝 부분과 일치합니다.

/etc/passwd 파일을 사용하여 어떻게 작동하는지 살펴보겠습니다.

먼저 /etc/passwd에서 root 문자열을 찾는 간단한 검색을 고려해 보십시오.

grep root /etc/passwd

다른 항목에도 "root" 문자열이 포함될 수 있으므로 출력에 여러 행이 나타날 수 있습니다.

root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

이제 이를 정교하게 다듬어 보겠습니다. /etc/passwd 파일에서 각 레코드의 첫 번째 필드는 사용자 이름입니다. root 사용자에 대한 사용자 레코드만 찾으려면 ^를 사용하여 검색 범위를 행의 시작 부분으로 고정할 수 있습니다.

다음 명령어를 실행하십시오. ^root 패턴은 root시작하는 행만 일치시키도록 grep에 지시합니다.

grep ^root /etc/passwd

이번에는 출력이 훨씬 더 구체적이며 root 사용자에 대한 행만 표시됩니다.

root:x:0:0:root:/root:/bin/bash

다음으로 행 끝 앵커인 $를 사용해 보겠습니다. /etc/passwd 레코드의 마지막 필드는 사용자의 기본 로그인 쉘을 지정합니다. 이를 사용하여 /bin/bash를 기본 쉘로 사용하는 모든 사용자를 찾을 수 있습니다.

bash$ 패턴은 bash 문자열로 끝나는 모든 행과 일치합니다.

grep bash$ /etc/passwd

이 명령어는 /bin/bash가 할당된 쉘인 모든 사용자 항목을 표시합니다.

root:x:0:0:root:/root:/bin/bash

(참고: 시스템의 다른 사용자가 기본 쉘로 bash 를 사용하는 경우 출력 결과가 다를 수 있습니다.)

^$ 앵커를 사용하면 검색 결과를 크게 좁혀 원하는 내용을 정확하게 찾을 수 있습니다.

기본 정규 표현식으로 패턴 매칭하기

이 단계에서는 grep과 함께 기본 정규 표현식 (BRE) 을 사용하여 더욱 유연한 검색 패턴을 만드는 방법을 살펴봅니다. BRE 에서 메타문자라고 불리는 특정 문자들은 문자 그대로의 의미를 넘어선 특별한 의미를 갖습니다. 이를 통해 고정된 문자열뿐만 아니라 패턴을 일치시킬 수 있습니다.

두 가지 핵심 메타문자인 *(별표) 와 .(마침표) 를 살펴보겠습니다.

먼저 별표 (*) 를 살펴보겠습니다. 이 메타문자는 바로 앞의 문자가 0 번 이상 반복되는 것과 일치합니다. 이를 실제로 확인하려면 다음 명령어를 실행하십시오. 쉘이 *를 파일 와일드카드로 확장하지 않고 문자 그대로의 패턴으로 처리하도록 패턴을 작은따옴표 ('roo*') 로 묶습니다.

grep 'roo*' /etc/passwd

출력에는 다음과 같이 여러 행이 표시될 것입니다.

root:x:0:0:root:/root:/bin/bash
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
systemd-timesync:x:104:110:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
rtkit:x:108:113:RealtimeKit,,,:/proc:/usr/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

이 결과를 분석해 보겠습니다. 'roo*' 패턴은 ro 뒤에 0 개 이상의 o가 오는 행을 검색합니다.

  • root 행은 roo(ro 뒤에 한 개의 o) 를 포함하므로 일치합니다.
  • proxy 행은 "proxy"에 ro(ro 뒤에 0 개의 o) 를 포함하므로 일치합니다.
  • systemd-timesync 행은 "Synchronization"에 ro를 포함하므로 일치합니다.
  • rtkit 행은 "proc"에 ro를 포함하므로 일치합니다.
  • operator 행은 "operator"와 "/root" 모두에 ro를 포함하므로 일치합니다.

이제 마침표 (.) 메타문자를 살펴보겠습니다. 마침표는 임의의 단일 문자와 일치합니다. 다음 명령어를 실행하여 동작이 어떻게 다른지 확인하십시오.

grep 'ro.' /etc/passwd

이번에도 출력에는 여러 일치 항목이 표시됩니다.

root:x:0:0:root:/root:/bin/bash
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
systemd-timesync:x:104:110:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
rtkit:x:108:113:RealtimeKit,,,:/proc:/usr/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

'ro.' 패턴은 ro 뒤에 정확히 하나의 임의의 문자가 오는 행을 검색합니다.

  • root 행은 "root"에서 ro 뒤에 o가 오므로 일치합니다.
  • proxy 행은 "proxy"에서 ro 뒤에 x가 오므로 일치합니다.
  • systemd-timesync 행은 "Synchronization"에서 ro 뒤에 n이 오므로 일치합니다.
  • rtkit 행은 "proc"에서 ro 뒤에 c가 오므로 일치합니다.
  • operator 행은 "operator"와 "/root"에서 ro 뒤에 다른 문자가 오므로 일치합니다.

출력을 비교해 보면 정규 표현식의 위력을 명확히 알 수 있습니다. 'roo*''ro.' 패턴 모두 여러 행을 일치시키지만, 서로 다른 메타문자를 통해 검색 방식을 다양하게 미세 조정할 수 있음을 보여줍니다.

복잡한 검색을 위해 확장 정규 표현식 사용하기

이 단계에서는 더욱 복잡하고 강력한 검색을 수행하기 위해 확장 정규 표현식 (ERE) 을 사용하는 방법을 배웁니다. ERE 는 기본 정규 표현식 (BRE) 보다 더 풍부한 메타문자 세트를 제공합니다. ERE 를 활성화하려면 grep -E 명령어나 전통적인 별칭인 egrep을 사용할 수 있습니다. grep -E를 사용하는 것이 더 현대적이고 권장되는 방식입니다.

먼저 수량자 (Quantifier) 를 살펴보겠습니다. ERE 에서는 중괄호 {}를 사용하여 문자가 나타나야 하는 정확한 횟수를 지정할 수 있습니다. 예를 들어, 소문자 'o'가 정확히 두 번 연속으로 나타나는 행을 찾으려면 o{2} 패턴을 사용할 수 있습니다.

다음 명령어를 실행하십시오. 쉘이 특수 문자를 오해하지 않도록 패턴을 작은따옴표로 묶습니다.

grep -E 'o{2}' /etc/passwd

출력에는 "oo"를 포함하는 여러 행이 표시됩니다.

root:x:0:0:root:/root:/bin/bash
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

이 명령어는 o{2} 패턴이 "root", "spool" 및 기타 항목에서 발견되는 두 개의 연속된 'o' 문자와 정확히 일치하기 때문에 작동합니다.

다음으로 교체 (Alternation) 를 살펴보겠습니다. 이 강력한 ERE 기능은 'OR' 연산자 역할을 하는 파이프 기호 |를 사용하여 여러 가능한 패턴 중 하나를 검색할 수 있게 해줍니다.

예를 들어, 대소문자 구분이 확실하지 않아 root 또는 Root에 대한 사용자 레코드를 찾으려는 경우 다음 명령어를 사용할 수 있습니다.

grep -E 'root|Root' /etc/passwd

이 명령어는 root 문자열 또는 Root 문자열을 포함하는 모든 행을 검색합니다. 출력 결과는 다음과 같습니다.

root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

root 사용자 행과 operator 행 모두 소문자 "root" 문자열을 포함하고 있으므로 일치합니다.

grep -E로 활성화되는 확장 정규 표현식은 복잡한 검색 패턴을 작성하기 위한 더욱 표현력 있고 강력한 구문을 제공하여 grep을 텍스트 처리에 없어서는 안 될 도구로 만들어 줍니다.

요약

이 실습에서는 Linux 에서 기본적인 텍스트 검색을 수행하기 위해 grep 명령어를 사용하는 방법을 배웠습니다. 단일 파일 내에서 특정 문자열을 찾는 기본 검색부터 시작하여 여러 파일로 검색 범위를 확장하고, grep이 일치하는 행 앞에 해당 파일 이름을 붙이는 방식을 관찰했습니다. 또한 파일 내에서 패턴의 위치를 찾는 데 유용한 -n 옵션을 사용하여 각 일치 항목의 행 번호를 표시하는 방법도 익혔습니다.

더 나아가, 행의 시작 (^) 또는 끝 ($) 에서 텍스트를 찾기 위해 앵커를 사용하는 고급 패턴 매칭 기능을 살펴보았습니다. 실습이 진행됨에 따라 기본 및 확장 정규 표현식의 사용법을 다루었으며, 이를 통해 파일 내에서 특정 정보를 찾기 위한 더욱 복잡하고 강력한 검색 패턴을 구성할 수 있게 되었습니다.