grep 요약

10238 단어 grep

grep 요약



grep 기술을 정리해 보았습니다.
생각나면 추기해 갑니다.

사용하는 로그 (적당히 수중의 nginx의 로그를 가공해 보았을 뿐....)

zsh
$ cat access.log
127.0.0.1 - - [12/Dec/2015:13:23:32 +0900] "GET / HTTP/1.1" 200 612 "-" "curl/7.43.0"
127.0.0.1 - - [12/Dec/2015:13:23:37 +0900] "GET /hoge HTTP/1.1" 404 168 "-" "curl/7.43.0"
127.0.0.1 - - [12/Dec/2015:13:24:25 +0900] "GET /?fuga=0 HTTP/1.1" 200 612 "-" "curl/7.43.0"
127.0.0.1 - - [12/Dec/2015:13:24:38 +0900] "GET /hoge?fuga=0 HTTP/1.1" 404 168 "-" "curl/7.43.0"
127.0.0.1 - - [12/Dec/2015:13:25:44 +0900] "GET /50x.html HTTP/1.1" 500 537 "-" "curl/7.43.0"
127.0.0.1 - - [12/Dec/2015:13:35:56 +0900] "GET /gethost HTTP/1.1" 200 612 "-" "curl/7.43.0"127.0.0.1 - - [12/Dec/2015:13:39:02 +0900] "GET / HTTP/1.1" 200 612 "-" "curl/7.43.0"
$ cat error.log
2015/12/12 13:23:37 [error] 33901#0: *2 open() "/usr/local/Cellar/nginx/1.8.0/html/hoge" failed (2: No such file or directory), client: 127.0.0.1, server: localhost, request: "GET /hoge HTTP/1.1", host: "localhost:8080"
2015/12/12 13:24:38 [error] 33901#0: *4 open() "/usr/local/Cellar/nginx/1.8.0/html/hoge" failed (2: No such file or directory), client: 127.0.0.1, server: localhost, request: "GET /hoge?fuga=0 HTTP/1.1", host: "localhost:8080"
2015/12/12 13:53:51 [emerg] 38309#0: unexpected "{" in /usr/local/etc/nginx/nginx.conf:18

특정 문자열을 포함하는 행을 검색합니다.


  • 문자열로 검색grep [文字列] ファイルhoge를 포함하는 행을 꺼냅니다

  • zsh
    $ grep hoge access.log
    127.0.0.1 - - [12/Dec/2015:13:23:37 +0900] "GET /hoge HTTP/1.1" 404 168 "-" "curl/7.43.0"
    127.0.0.1 - - [12/Dec/2015:13:24:38 +0900] "GET /hoge?fuga=0 HTTP/1.1" 404 168 "-" "curl/7.43.0"
    
  • 정규 표현식으로 검색egrep [正規表現] ファイル or grep -E13:23 ~ 25 분까지 추출

  • zsh
    $ egrep '13:2[3-5]' access.log
    127.0.0.1 - - [12/Dec/2015:13:23:32 +0900] "GET / HTTP/1.1" 200 612 "-" "curl/7.43.0"
    127.0.0.1 - - [12/Dec/2015:13:23:37 +0900] "GET /hoge HTTP/1.1" 404 168 "-" "curl/7.43.0"
    127.0.0.1 - - [12/Dec/2015:13:24:25 +0900] "GET /?fuga=0 HTTP/1.1" 200 612 "-" "curl/7.43.0"
    127.0.0.1 - - [12/Dec/2015:13:24:38 +0900] "GET /hoge?fuga=0 HTTP/1.1" 404 168 "-" "curl/7.43.0"
    127.0.0.1 - - [12/Dec/2015:13:25:44 +0900] "GET /50x.html HTTP/1.1" 500 537 "-" "curl/7.43.0"
    
  • 대소문자 구분 없이 검색grep -i [文字列] ファイル

  • zsh
    $ grep get access.log
    127.0.0.1 - - [12/Dec/2015:13:35:56 +0900] "GET /gethost HTTP/1.1" 200 612 "-" "curl/7.43.0"
    
    $ grep -i get access.log
    127.0.0.1 - - [12/Dec/2015:13:23:32 +0900] "GET / HTTP/1.1" 200 612 "-" "curl/7.43.0"
    127.0.0.1 - - [12/Dec/2015:13:23:37 +0900] "GET /hoge HTTP/1.1" 404 168 "-" "curl/7.43.0"
    127.0.0.1 - - [12/Dec/2015:13:24:25 +0900] "GET /?fuga=0 HTTP/1.1" 200 612 "-" "curl/7.43.0"
    127.0.0.1 - - [12/Dec/2015:13:24:38 +0900] "GET /hoge?fuga=0 HTTP/1.1" 404 168 "-" "curl/7.43.0"
    127.0.0.1 - - [12/Dec/2015:13:25:44 +0900] "GET /50x.html HTTP/1.1" 500 537 "-" "curl/7.43.0"
    127.0.0.1 - - [12/Dec/2015:13:35:56 +0900] "GET /gethost HTTP/1.1" 200 612 "-" "curl/7.43.0"
    127.0.0.1 - - [12/Dec/2015:13:39:02 +0900] "GET / HTTP/1.1" 200 612 "-" "curl/7.43.0"
    
    

    특정 문자열을 포함하지 않음


    grep -v 文字列 ファイル지금까지의 옵션 등도 병용 가능200 를 포함하지 않는 행 추출

    zsh
    $ grep -v ' 200 ' access.log
    127.0.0.1 - - [12/Dec/2015:13:23:37 +0900] "GET /hoge HTTP/1.1" 404 168 "-" "curl/7.43.0"
    127.0.0.1 - - [12/Dec/2015:13:24:38 +0900] "GET /hoge?fuga=0 HTTP/1.1" 404 168 "-" "curl/7.43.0"
    127.0.0.1 - - [12/Dec/2015:13:25:44 +0900] "GET /50x.html HTTP/1.1" 500 537 "-" "curl/7.43.0"
    

    문자열을 고정하여 검색 (정규 표현식 사용 안 함)



    grep에서도 약간의 정규 표현 가능 버리는 폐해'[error]' 가 정규 표현식이 되어 버리므로 e or r or o 가 포함되면 일치가

    zsh
    $ grep '[error]' error.log
    2015/12/12 13:23:37 [error] 33901#0: *2 open() "/usr/local/Cellar/nginx/1.8.0/html/hoge" failed (2: No such file or directory), client: 127.0.0.1, server: localhost, request: "GET /hoge HTTP/1.1", host: "localhost:8080"
    2015/12/12 13:24:38 [error] 33901#0: *4 open() "/usr/local/Cellar/nginx/1.8.0/html/hoge" failed (2: No such file or directory), client: 127.0.0.1, server: localhost, request: "GET /hoge?fuga=0 HTTP/1.1", host: "localhost:8080"
    2015/12/12 13:53:51 [emerg] 38309#0: unexpected "{" in /usr/local/etc/nginx/nginx.conf:18
    
    '[error]' 를 지정해 추출하고 싶은 경우fgrep [文字列] ファイル or grep -F
    zsh
    $ grep -F '[error]' error.log
    2015/12/12 13:23:37 [error] 33901#0: *2 open() "/usr/local/Cellar/nginx/1.8.0/html/hoge" failed (2: No such file or directory), client: 127.0.0.1, server: localhost, request: "GET /hoge HTTP/1.1", host: "localhost:8080"
    2015/12/12 13:24:38 [error] 33901#0: *4 open() "/usr/local/Cellar/nginx/1.8.0/html/hoge" failed (2: No such file or directory), client: 127.0.0.1, server: localhost, request: "GET /hoge?fuga=0 HTTP/1.1", host: "localhost:8080"
    # または[]をエスケープ
    $ grep '\[error\]' error.log
    2015/12/12 13:23:37 [error] 33901#0: *2 open() "/usr/local/Cellar/nginx/1.8.0/html/hoge" failed (2: No such file or directory), client: 127.0.0.1, server: localhost, request: "GET /hoge HTTP/1.1", host: "localhost:8080"
    2015/12/12 13:24:38 [error] 33901#0: *4 open() "/usr/local/Cellar/nginx/1.8.0/html/hoge" failed (2: No such file or directory), client: 127.0.0.1, server: localhost, request: "GET /hoge?fuga=0 HTTP/1.1", host: "localhost:8080"
    

    검색 중복



    grep을 | (파이프)로 겹쳐200 를 포함해 13시 20분대의 로그를 추출

    zsh
    $ grep ' 200 ' access.log | grep '2015:13:2'
    127.0.0.1 - - [12/Dec/2015:13:23:32 +0900] "GET / HTTP/1.1" 200 612 "-" "curl/7.43.0"
    127.0.0.1 - - [12/Dec/2015:13:24:25 +0900] "GET /?fuga=0 HTTP/1.1" 200 612 "-" "curl/7.43.0"
    

    여러 조건으로 검색


    grep -e [文字列] -e [文字列] ... ファイル200 포함 또는 500 포함된 행 추출
    egrep을 이용하여 정규식으로도 가능

    zsh
    $ grep -e ' 200 ' -e ' 500 ' access.log
    127.0.0.1 - - [12/Dec/2015:13:23:32 +0900] "GET / HTTP/1.1" 200 612 "-" "curl/7.43.0"
    127.0.0.1 - - [12/Dec/2015:13:24:25 +0900] "GET /?fuga=0 HTTP/1.1" 200 612 "-" "curl/7.43.0"
    127.0.0.1 - - [12/Dec/2015:13:25:44 +0900] "GET /50x.html HTTP/1.1" 500 537 "-" "curl/7.43.0"
    127.0.0.1 - - [12/Dec/2015:13:35:56 +0900] "GET /gethost HTTP/1.1" 200 612 "-" "curl/7.43.0"
    127.0.0.1 - - [12/Dec/2015:13:39:02 +0900] "GET / HTTP/1.1" 200 612 "-" "curl/7.43.0"
    

    행 번호 부여


    grep -n [他オプション] ... ファイル선두에 행 번호가 부여된다

    zsh
    $ grep -n -e ' 200 ' -e ' 500 ' access.log
    1:127.0.0.1 - - [12/Dec/2015:13:23:32 +0900] "GET / HTTP/1.1" 200 612 "-" "curl/7.43.0"
    3:127.0.0.1 - - [12/Dec/2015:13:24:25 +0900] "GET /?fuga=0 HTTP/1.1" 200 612 "-" "curl/7.43.0"
    5:127.0.0.1 - - [12/Dec/2015:13:25:44 +0900] "GET /50x.html HTTP/1.1" 500 537 "-" "curl/7.43.0"
    6:127.0.0.1 - - [12/Dec/2015:13:35:56 +0900] "GET /gethost HTTP/1.1" 200 612 "-" "curl/7.43.0"
    7:127.0.0.1 - - [12/Dec/2015:13:39:02 +0900] "GET / HTTP/1.1" 200 612 "-" "curl/7.43.0"
    

    검색과 일치하는 부분만 추출


    grep -o [文字列] ファイル
    zsh
    $ grep -o '12/Dec/2015:13:2'  access.log
    12/Dec/2015:13:2
    12/Dec/2015:13:2
    12/Dec/2015:13:2
    12/Dec/2015:13:2
    12/Dec/2015:13:2
    
    $ egrep -o '12/Dec/2015:13:2[0-9]'  access.log
    12/Dec/2015:13:23
    12/Dec/2015:13:23
    12/Dec/2015:13:24
    12/Dec/2015:13:24
    12/Dec/2015:13:25
    

    검색과 일치하는 행이 있는 파일 이름 표시


    grep -l [文字列] ファイルhoge 가 포함된 파일 이름만 표시

    zsh
    $ grep -l hoge *
    access.log
    error.log
    

    검색과 일치하는 행이 없는 파일 이름 표시


    grep -l [文字列] ファイルerror 내부에 포함되지 않은 파일 이름 표시

    zsh
    $ grep -L error *
    access.log
    

    추출하지 않고 색만 붙인다



    grep에 color가 설정되어 있으면 추출되어 매치한 캐릭터 라인에 색이 붙습니다만,
    추출하지 않고 문자열에 색만 붙이고 싶은 경우 있네요.
    그 경우는 -E 또는 egrep 의 자리표현을 이용해 말미가 포함되도록 하면,
    모든 캐릭터 라인이 출력됩니다만, 매치 한 캐릭터 라인에는 색이 붙습니다.



    여러 가지 색을 붙인다



    추출하지 않고 색을 칠 수 있다면 문자열별로 색을 바꾸고 싶어요 (warn|error|crit|etc...)
    grep의 색은 GREP_COLOR 라는 변수로 결정되므로 grep을 파이프로 전달할 때마다 변경합니다.



    --color=always 는 색을 다음에 계승시키는 옵션으로, default라고 --color=auto 가 되어 있다고 생각합니다.
    붙이지 않으면 아래와 같이, 마지막 grep의 결과만 색이 붙는 유감스러운 상태가 됩니다.

    좋은 웹페이지 즐겨찾기