컴퓨터/운영체제(주로 리눅스)

[리눅스] grep 명령어 사용법 - 파일에서 문자열 패턴 검색

REAKWON 2021. 9. 1. 23:51

리눅스 프로그래밍과 관현한 더 많은 정보와 예제를 담은 리눅스 교재를 배포했습니다. 아래의 페이지에서 리눅스 교재를 받아가세요.

https://reakwon.tistory.com/233

 

리눅스 프로그래밍 note 배포

티스토리에 리눅스에 관한 내용을 두서없이 여지껏 포스팅했었데요. 저도 제 포스팅을 찾기가 어렵기도 하고 티스토리에서 코드삽입을 하게 되면 이게 일자로 쭉 쓰여져있는 x같은 현상이 생겨

reakwon.tistory.com

 

grep

grep 명령어는 각 파일에서 패턴(Pattern)을 검색할때 사용하는 명령어로 리눅스에서 매우 자주 사용하는 명령어입니다. 주로 사용하는 방법은 아래와 같이 나뉘어집니다.

grep [OPTION...] PATTERNS [FILE...]
grep [OPTION...] -e PATTERNS ... [FILE...]
grep [OPTION...] -f PATTERN_FILE ... [FILE...]

 

1. 첫번째 방식 : 옵션과 함께 PATTERNS를 주어진 파일들에서 찾습니다.

2. 두번째 방식 : 옵션과 함께 정규표현식으로 PATTERNS을 정의하고 주어진 파일들에서 찾습니다.

3. 세번째 방식 : 옵션과 함께 파일에 정의된 PATTERN을 주어진 파일들에서 찾습니다.

 

FILE을 지정하는 방법에 따른 검색

FILE은 찾을 대상의 파일을 의미합니다. 찾을 파일들을 명시적으로 지정하게 되면 그 파일만들 탐색합니다. 만약 -(대쉬, dash)이면 stdin에서 찾습니다. 즉, 키보드로 입력이 되면 패턴을 찾는다는 방식입니다. 만약 파일이 주어지지 않았다면 -r 옵션에 따라 다릅니다. -r 옵션이 주어지면 현재 디렉토리에 있는 파일들을 대상으로 하위 디렉토리까지 패턴을 찾습니다. 그렇지 않는다면 표준 입력(stdin)으로 입력받습니다.

이러한 예를 들어보도록 하겠습니다.

ex ) FILE을 명시 

현재 디렉토리 /etc이며 여기서 shadow, passwd 파일에서 root 패턴을 포함하는 라인을 출력합니다.

# pwd
/etc
# grep "root" shadow passwd
shadow:root:$6$Mg4AK6u6xv/EZk93$vwpv6ALfAv1jH0.3Ub0hIjVgDXJSa9Mwk625jfzNzYzR48aypIFflbhUL4VAxECs3PiFr6NTA0ghnAfpAj2Bz1:18693:0:99999:7:::
passwd:root:x:0:0:root:/root:/bin/bash
passwd:nm-openvpn:x:118:124:NetworkManager OpenVPN,,,:/var/lib/openvpn/chroot:/usr/sbin/nologin

 

ex) FILE을 "-"로 지정

이렇게 파일대신 대시를 사용하게 되면 표준입력으로 입력된 것에서 패턴을 검색합니다. Apple과 일치하게 되면 색이 달라지는 것을 볼 수 있습니다.

# grep "Apple" -
Apple
Apple
goo
foo
boo
Apple
Apple
apple
^C

 

ex) FILE 지정 생략

FILE 생략시 역시 키보드로 입력받는 데이터 중에서 검색을 합니다. 파일을 '-' 준것과 동일함을 알 수가 있네요.

# grep "Apple"
Apple
Apple
Banana
App
Application
Apple
Apple
^C

 

ex) -r 옵션과 FILE 지정 생략

현재 디렉토리부터 하위 디렉토리에 있는 파일까지 전부 검색합니다. 여기서는 "root"라는 패턴이 포함되면 그 라인을 전부 출력하게 됩니다.

# pwd
/etc
# grep "root" -r
ca-certificates.conf:mozilla/Comodo_AAA_Services_root.crt
shadow:root:$6$Mg4AK6u6xv/EZk93$vwpv6ALfAv1jH0.3Ub0hIjVgDXJSa9Mwk625jfzNzYzR48aypIFflbhUL4VAxECs3PiFr6NTA0ghnAfpAj2Bz1:18693:0:99999:7:::
passwd_bak:root:x:0:0:root:/root:/bin/bash
passwd_bak:nm-openvpn:x:118:124:NetworkManager OpenVPN,,,:/var/lib/openvpn/chroot:/usr/sbin/nologin
xattr.conf:xfsroot.*                    skip            # xfs specific; obsolete
nanorc:## In root's .nanorc you might want to use:
...//생략//...

 

지원하는 옵션들의 예제

grep은 많이 쓰이는 명령어인 만큼, 매우 많은 옵션을 지원하고 있습니다. 전부 외우고 숙지하는 것은 무리이니까 자주 사용하고 유용한 옵션들만 알아보도록 하겠습니다.

옵션 설명
-r recursive의 약자로 현재 디렉토리부터 하위 디렉토리까지 전부 탐색합니다.
-i ignore case의 약자로 패턴의 대,소문자를 구분하지 않고 검색합니다.
-c 파일에서 지정한 패턴과 얼마나 일치하는지에 대한 수(count)가 출력됩니다.
-n 파일의 어느 라인에서 패턴이 일치하는지 라인 넘버(number)도 같이 출력해줍니다.
-l 패턴과 일치하는 파일의 이름만을 출력합니다.
-f 파일에 있는 패턴으로 검색합니다.
-e 정규 표현식으로 패턴을 검색합니다.
-v 패턴과 일치하는 라인을 삭제합니다. 불필요한 라인을 삭제할때 유용합니다.

 

 

grep 사용 예제

1) grep -irn "<stdio.h>" : stdio.h 헤더 파일을 사용하는 파일을 현재 디렉토리부터 검색하여 line도 같이 출력

# grep -irn "<stdio.h>"
test.c:1:#include <stdio.h>

 

2) 명령어의 결과를 grep으로 검색

grep은 기본적으로 파일을 지정하지 않는다면 stdin으로 입력을 받는다고 위에서 설명을 했었습니다. 리눅스에서 파이프는 어떤 명령어의 출력(정확히 이야기하면 표준 출력, stdout)을 다음 명령어의 stdin으로 넘겨줍니다. 그래서 이런 명령어 형식을 자주쓰게 됩니다.

명령어| grep "찾을 패턴"

 

예를 들면 현재 실행되는 프로세스 중에 ssh와 관련된 프로세스를 알아보고 싶다면 아래와 같은 조합으로 사용할 수 있습니다. 

# ps -ef | grep "ssh"
ubuntu      2032    1955  0  8월24 ?      00:00:03 /usr/bin/ssh-agent /usr/bin/im-launch env GNOME_SHELL_SESSION_MODE=ubuntu /usr/bin/gnome-session --systemd --session=ubuntu
root      108345       1  0  8월25 ?      00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root      275674  108345  0 20:45 ?        00:00:00 sshd: ubuntu [priv]

 

ps 명령어는 결과를 stdout으로 출력하기 때문에 이 출력 결과를 grep으로 넘겨줍니다. 전달받은 표준 출력은 grep의 표준 입력으로 전해져 "ssh"의 패턴과 일치하면 출력하게 됩니다. 이해가 되시나요?

만약 pipe와 관련한 설명이 부족하다면 아래의 링크를 통해서 더 자세히 알아보세요.

https://reakwon.tistory.com/115

 

[리눅스] 재지정, 리다이렉션(redirection: >, <)과 파이프(|) 개념과 쉬운 설명

재지정(Redirection) 리눅스에서 프로그램은 보통 세 개의 파일 서술사를 열게 됩니다. 바로 표준 입력(standard input, STDIN), 표준 출력(standard output, STDOUT), 그리고 표준 에러(standard error, STDERR)..

reakwon.tistory.com

 

3) # grep -v "root" /etc/passwd : 패턴 root이 없는 라인만 검색

# grep -v "root" /etc/passwd
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin

 

여기까지 grep에 대한 기본적인 원리와 자주 사용하는 사용법을 알아보았습니다. 정규표현식을 아시는 분은 더욱 유용하게 사용할 수 있겠지만 저는 거기까지 필요는 없이 잘 사용하고 있습니다.

 

반응형