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
특정 문자열을 포함하는 행을 검색합니다.
$ 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 -E
13: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의 결과만 색이 붙는 유감스러운 상태가 됩니다.
Reference
이 문제에 관하여(grep 요약), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/momin/items/4360918a740271fcf57f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)