본문으로 바로가기

[Linux] 리눅스 파일에서 원하는 내용 찾기 - grep

category OS/Linux 2021. 9. 18. 18:57

목차

    1. grep 명령어

    [개요]
    패턴: 찾을 문자열 또는 정규 표현식
    
    # grep [옵션] [패턴] [파일명]

     global / regular expression / print

     파일에서 문자열이나 지정한 패턴(정규 표현식)을 이용해 원하는 내용이 들어간 행을 찾아 출력하는 명령어

     리다이렉션 (>,>>)과 파이프라인 ( | )을 같이 사용해서 쉽게 원하는 내용을 따로 출력하거나 저장할 수 있습니다.

     grep의 변형 명령어로 egrep과 fgrep이 있습니다.

    1.1. grep 옵션

    1.1.1. Regexp selection and interpretation

    Regexp selection and interpretation(정규식 선택 및 해석): 
      -E, --extended-regexp     패턴을 확장 정규 표현식으로 설정(=egrep) 
      -F, --fixed-strings           패턴을 정규 표현식(RegEx)이 아닌 일반 문자열로 설정
      -G, --basic-regexp          패턴을 기본 정규 표현식으로 설정
      -P, --perl-regexp            패턴을 Perl 정규 표현식으로 설정
      -e, --regexp=PATTERN    하나 이상의 탐색 패턴을 설정
      -f, --file=FILE                 파일에 포함된 내용을 패턴으로 설정 -> grep -f aapl.txt stock.txt
      -i, --ignore-case             대소문자 무시
      -w, --word-regexp          패턴이 단어 단위로 일치하도록 설정 ->  grep -w aapl stock.txt, grep -w aa stock.txt
      -x, --line-regexp             패턴이 라인 단위로 일치하도록 설정
      -z, --null-data                라인을 newline(\n)이 아닌 NULL(\0)로 구분하도록 설정

    1.1.2. Miscellaneous

    Miscellaneous(기타): 
      -s, --no-messages         오류 메시지 숨기기
      -v, --invert-match          패턴이 포함되지 않는 행 출력
      -V, --version                버전 정보 표시 및 종료
          --help                    도움말 텍스트 표시 및 종료

    1.1.3. Output control

    Output control(출력 제어): 
      -m, --max-count=NUM       최대 검색 결과 행 개수 제한
      -b, --byte-offset                 패턴과 일치하는 줄의 시작점 출력
      -n, --line-number               줄의 번호와 내용을 같이 출력
          --line-buffered               모든 라인에 플러시 출력
      -H, --with-filename             검색 결과 출력 시 라인 앞에 파일 이름 출력
      -h, --no-filename                검색 결과 출력 시, 파일 이름 출력 안 함
          --label=LABEL                LABEL을 표준 입력 파일 이름 접두사로 사용
      -o, --only-matching             패턴과 일치하는 행만 표시
      -q, --quiet, --silent              검색 결과 출력하지 않음
      -a, --text                           바이너리 파일(. bin)을 텍스트 파일처럼 처리
      -I                                    바이너리 파일(.bin)은 검사하지 않음
      -d, --directories=ACTION     디렉토리 처리 방식 설정(read, recurse, skip)
      -D, --devices=ACTION         장치 파일 처리 방식 설정(read, skip)
      -r, --recursive                     하위 디렉토리 포함하여 출력
      -R, --dereference-recursive    심볼릭 링크를 따라가며 모든 하위 디렉토리 포함하여 출력
          --include=FILE_PATTERN   FILE_PATTERN과 일치하는 파일만 검색
          --exclude=FILE_PATTERN   FILE_PATTERN과 일치하는 파일 및 디렉토리 건너뛰기
          --exclude-from=FILE         FILE의 모든 파일 패턴과 일치하는 파일 건너뛰기
          --exclude-dir=PATTERN     PATTERN과 일치하는 디렉토리는 건너뛰기
      -L, --files-without-match        패턴이 존재하지 않는 파일 이름만 출력
      -l, --files-with-matches          패턴이 존재하는 파일 이름만 출력
      -c, --count                         파일 당 패턴이 일치하는 라인의 개수 출력
      -T, --initial-tab                    탭을 정렬
      -Z, --null                            파일 이름 뒤에 0바이트 인쇄

    1.1.4. Context control

    Context control(문맥 제어): 
      -B, --before-context=NUM  특정패턴 위 추가로 여러 행 출력
      -A, --after-context=NUM    특정패턴 아래 추가로 여러 행 출력
      -C, --context=NUM           특정패턴 위아래 추가로 여러 행 출력

    1.2. 정규 표현식

    정규 표현식

     확장 정규식은 grep -E 또는 egrep을 이용하면 사용 할 수 있습니다.

    정규 표현식을 grep명령어에서 활용할 경우 -e 옵션을 사용해도되고 안 해도 됩니다.

     


    2. grep 예제(option 활용)

     실습을 위해 여러 텍스트 파일을 준비합니다.

    경로: ~/test [stock1.txt]
    # cat stock1.txt
    NASDAQ aapl price is $148.97
    NASDAQ msft price is $295.71
    NASDAQ tsla price is $736.27
    
    NYSEARCA spy price is $445.44
    NYSEARCA sso price is $128.66
    NYSEARCA spxl price is $119.02
    NYSEARCA upro price is $126.65
    
    NASDAQ qqq price is $376.59
    NYSEARCA qld price is $80.66
    NASDAQ tqqq price is $145.55
    
    NYSE net price is $127.48
    NYSE cpng price is $29.98
    
    경로: ~/test [stock2.txt]
    # cat stock2.txt
    KOSPI samsung electronics price is \75,300
    KOSPI naver price is \410,000
    KOSPI kakao price is \130,000
    
    KOSDAQ kakaogames price is \73,800
    KOSDAQ Seegene price is \63,200
    
    경로: ~/test [ny.txt]
    # cat ny.txt
    ^NY
    
    경로: ~/test/test2 (하위 경로) [stock3.txt]
    # cat stock3.txt
    NASDAQ fb price is $364.72
    NASDAQ mrna price is $430.05
    
    NYSE pfe price is $43.89
    NYSE ma price is $343.04

    2.1. 특정 파일에서 패턴 검색

    # grep "패턴" 파일명

    # grep "NASDAQ" stock1.txt
    NASDAQ aapl price is $148.97
    NASDAQ msft price is $295.71
    NASDAQ tsla price is $736.27
    NASDAQ qqq price is $376.59
    NASDAQ tqqq price is $145.55
    
    # grep "^NY" stock1.txt
    NYSEARCA spy price is $445.44
    NYSEARCA sso price is $128.66
    NYSEARCA spxl price is $119.02
    NYSEARCA upro price is $126.65
    NYSEARCA qld price is $80.66
    NYSE net price is $127.48
    NYSE cpng price is $29.98

    2.2. 여러 파일에서 패턴 검색

    # grep "패턴" 파일명1 파일명 2...

    # grep "DAQ" stock1.txt stock2.txt test2/stock3.txt
    stock1.txt:NASDAQ aapl price is $148.97
    stock1.txt:NASDAQ msft price is $295.71
    stock1.txt:NASDAQ tsla price is $736.27
    stock1.txt:NASDAQ qqq price is $376.59
    stock1.txt:NASDAQ tqqq price is $145.55
    stock2.txt:KOSDAQ kakaogames price is \73,800
    stock2.txt:KOSDAQ Seegene price is \63,200
    test2/stock3.txt:NASDAQ fb price is $364.72
    test2/stock3.txt:NASDAQ mrna price is $430.05

    2.3. 특정 디렉터리 내 모든 파일에서 패턴 검색

    1. 현재 디렉토리 전체 파일 

    # grep "패턴" *

     

    2. 현재 디렉토리 전체 파일 및 하위 디렉토리 파일

    # grep -r "패턴" *

    # grep "a" *
    stock1.txt:NASDAQ aapl price is $148.97
    stock1.txt:NASDAQ tsla price is $736.27
    stock2.txt:KOSPI samsung electronics price is \75,300
    stock2.txt:KOSPI naver price is \410,000
    stock2.txt:KOSPI kakao price is \130,000
    stock2.txt:KOSDAQ kakaogames price is \73,800
    
    # grep -r "a" *
    stock1.txt:NASDAQ aapl price is $148.97
    stock1.txt:NASDAQ tsla price is $736.27
    stock2.txt:KOSPI samsung electronics price is \75,300
    stock2.txt:KOSPI naver price is \410,000
    stock2.txt:KOSPI kakao price is \130,000
    stock2.txt:KOSDAQ kakaogames price is \73,800
    test2/stock3.txt:NASDAQ mrna price is $430.05
    test2/stock3.txt:NYSE ma price is $343.04

    2.4. 대소문자 구분하지 않고 패턴 검색

    # grep -i "패턴" 파일명

    # grep "nas" stock1.txt
    결과가 없음
    
    # grep -i "nas" stock1.txt
    NASDAQ aapl price is $148.97
    NASDAQ msft price is $295.71
    NASDAQ tsla price is $736.27
    NASDAQ qqq price is $376.59
    NASDAQ tqqq price is $145.55

    2.5. 1개 이상의 패턴을 사용해 여러 가지 패턴 검색

    1. e 옵션 여러 개 사용

    # grep -e "패턴 1" -e "패턴 2" 파일명

     

    2. E 옵션 사용

    # grep -E "패턴 1|패턴 2" 파일명

     

    3. egrep 사용

    # egrep "패턴1|패턴2" 파일명

    1. -e 옵션 여러 개 사용
    # grep -e "aapl" -e "spy" stock1.txt
    NASDAQ aapl price is $148.97
    NYSEARCA spy price is $445.44
    
    2. -E 옵션을 사용해 확장 정규식 사용
    # grep -E "aapl|spy" stock1.txt
    NASDAQ aapl price is $148.97
    NYSEARCA spy price is $445.44
    
    3. egrep 사용
    # egrep "aapl|spy" stock1.txt
    NASDAQ aapl price is $148.97
    NYSEARCA spy price is $445.44

    2.6. 파일에 포함된 내용으로 검색

    # grep -f 패턴으로 사용할 파일명 파일명

    # cat ny.txt
    ^NY
    
    NY로 시작하는 패턴 검색
    # grep -f ny.txt stock1.txt
    NYSEARCA spy price is $445.44
    NYSEARCA sso price is $128.66
    NYSEARCA spxl price is $119.02
    NYSEARCA upro price is $126.65
    NYSEARCA qld price is $80.66
    NYSE net price is $127.48
    NYSE cpng price is $29.98

    2.7. 단어 단위로 패턴 검색

    # grep -w "패턴" 파일명

    # grep -w "NAS" stock1.txt
    단어 단위라 결과가 나오지 않음
    
    # grep -w "NASDAQ" stock1.txt
    NASDAQ aapl price is $148.97
    NASDAQ msft price is $295.71
    NASDAQ tsla price is $736.27
    NASDAQ qqq price is $376.59
    NASDAQ tqqq price is $145.55

    2.8. 특정 확장자 파일만 패턴 검색

    # grep "패턴" *.파일확장자

    # grep "[08]$" *.txt
    stock1.txt:NYSE net price is $127.48
    stock1.txt:NYSE cpng price is $29.98
    stock2.txt:KOSPI samsung electronics price is \75,300
    stock2.txt:KOSPI naver price is \410,000
    stock2.txt:KOSPI kakao price is \130,000
    stock2.txt:KOSDAQ kakaogames price is \73,800
    stock2.txt:KOSDAQ Seegene price is \63,200

    2.9. 비어있는 행 삭제 출력

    # grep -v '^[[:space:]]*$' 파일명

    # grep -v '^[[:space:]]*$' stock1.txt
    NASDAQ aapl price is $148.97
    NASDAQ msft price is $295.71
    NASDAQ tsla price is $736.27
    NYSEARCA spy price is $445.44
    NYSEARCA sso price is $128.66
    NYSEARCA spxl price is $119.02
    NYSEARCA upro price is $126.65
    NASDAQ qqq price is $376.59
    NYSEARCA qld price is $80.66
    NASDAQ tqqq price is $145.55
    NYSE net price is $127.48
    NYSE cpng price is $29.98

    2.10. 특정 패턴이 존재하지 않는 행 검색

    # grep -v "패턴" 파일명

    "NASDAQ"과 빈 행을 가지고 있지 않은 행 검색 
    
    # grep -v -E "NASDAQ|^[[:space:]]*$" stock1.txt
    또는
    # egrep -v "NASDAQ|^[[:space:]]*$" stock1.txt
    
    NYSEARCA spy price is $445.44
    NYSEARCA sso price is $128.66
    NYSEARCA spxl price is $119.02
    NYSEARCA upro price is $126.65
    NYSEARCA qld price is $80.66
    NYSE net price is $127.48
    NYSE cpng price is $29.98

    2.11. 최대 검색 행 제한 검색

    # grep -m 최대 검색 개수 "패턴" 파일명

    # grep -m 2 "NASDAQ" stock1.txt
    NASDAQ aapl price is $148.97
    NASDAQ msft price is $295.71
    
    # grep -m 3 "NASDAQ" stock1.txt
    NASDAQ aapl price is $148.97
    NASDAQ msft price is $295.71
    NASDAQ tsla price is $736.27

    2.12. 특정 패턴 행 및 주변 행 출력

    1. 특정 패턴 행 및 위로 n행 포함 출력(Before)

    # grep -B n "패턴" 파일명

     

    2. 특정 패턴 행 및 아래로 n행 포함 출력(After)

    # grep -A n "패턴" 파일명

     

    2. 특정 패턴 행 및 위아래로 n행 포함 출력(Context)

    # grep -C n "패턴" 파일명

    spxl 위로 2행 포함 출력(Before)
    # grep -B 2 "spxl" stock1.txt
    NYSEARCA spy price is $445.44
    NYSEARCA sso price is $128.66
    NYSEARCA spxl price is $119.02
    
    spxl 위로 1행 포함 출력(After)
    # grep -A 1 "spxl" stock1.txt
    NYSEARCA spxl price is $119.02
    NYSEARCA upro price is $126.65
    
    spxl 위 아래로 1행 포함 출력(Context)
    # grep -C 1 "spxl" stock1.txt
    NYSEARCA sso price is $128.66
    NYSEARCA spxl price is $119.02
    NYSEARCA upro price is $126.65

    2.13. 패턴이 존재하는, 존재하지 않는 파일명 출력

    1. 해당 패턴이 존재하는 파일명 출력

    # grep -l "패턴" 파일명

     

    2. 해당 패턴이 존재하지 않는 파일명 출력

    # grep -L "패턴" 파일명

    패턴이 존재하는 파일 이름만 출력(-l)
    # grep -lr "NASDAQ" *
    stock1.txt
    test2/stock3.txt
    
    # grep -lr "KOSPI" *
    stock2.txt
    
    패턴이 존재하지 않는 파일 이름만 출력(-L)
    # grep -Lr "NASDAQ" *
    ny.txt
    stock2.txt
    
    # grep -Lr "KOSPI" *
    ny.txt
    stock1.txt
    test2/stock3.txt

    2.14. 라인 번호 포함한 패턴 검색

    # grep -n "패턴" 파일명

    # grep -nr "NASDAQ" *
    stock1.txt:1:NASDAQ aapl price is $148.97
    stock1.txt:2:NASDAQ msft price is $295.71
    stock1.txt:3:NASDAQ tsla price is $736.27
    stock1.txt:10:NASDAQ qqq price is $376.59
    stock1.txt:12:NASDAQ tqqq price is $145.55
    test2/stock3.txt:1:NASDAQ fb price is $364.72
    test2/stock3.txt:2:NASDAQ mrna price is $430.05

    2.15. 파일 포함, 포함하지 않는 패턴 검색

    1. 파일명 출력

    # grep -H "패턴" 파일명

     

    2. 파일명 출력하지 않음

    # grep -h "패턴" 파일명

    파일명 포함
    # grep -Hr "NASDAQ" *
    stock1.txt:NASDAQ aapl price is $148.97
    stock1.txt:NASDAQ msft price is $295.71
    stock1.txt:NASDAQ tsla price is $736.27
    stock1.txt:NASDAQ qqq price is $376.59
    stock1.txt:NASDAQ tqqq price is $145.55
    test2/stock3.txt:NASDAQ fb price is $364.72
    test2/stock3.txt:NASDAQ mrna price is $430.05
    
    파일명 포함하지 않음
    # grep -hr "NASDAQ" *
    NASDAQ aapl price is $148.97
    NASDAQ msft price is $295.71
    NASDAQ tsla price is $736.27
    NASDAQ qqq price is $376.59
    NASDAQ tqqq price is $145.55
    NASDAQ fb price is $364.72
    NASDAQ mrna price is $430.05

    2.16. 파일 당 패턴이 일치하는 라인의 개수 출력

    # grep -c "패턴" 파일명

    # grep -cr "NASDAQ" *
    ny.txt:0
    stock1.txt:5
    stock2.txt:0
    test2/stock3.txt:2