다음 데이터가 포함된 로그 파일이 있습니다.
2019-02-11 00:05:58.241 [exec-178] Start request
2019-02-11 00:05:58.242 [exec-178] customer_name
2019-02-11 00:05:58.243 [exec-178] other process
2019-02-11 00:05:58.244 [exec-178] other process
2019-02-11 00:05:58.245 [exec-178] results
2019-02-11 00:05:58.246 [exec-178] End request (13ms)
단일 grep 명령을 사용하여 "customer_name" 및 "End request"를 캡처하고 싶습니다. 사용하려고 했지만 grep -E "[0-9]{2,4}ms
예상한 결과가 나오지 않습니다.
예상 출력:
2019-02-11 00:05:58.242 [exec-178] customer_name
2019-02-11 00:05:58.246 [exec-178] End request (13ms)
답변1
grep을 사용하여 grep -E
찾을 수 있는 패턴은 파이프 기호로 구분됩니다.
[root@server ~]# grep -Ei "customer_name|end request" file
2019-02-11 00:05:58.242 [exec-178] customer_name
2019-02-11 00:05:58.246 [exec-178] End request (13ms)
[root@server ~]#
발췌 man grep
:
-E, --extended-regexp PATTERN을 확장 정규식(ERE, 아래 참조)으로 해석합니다.
-i, --ignore-case PATTERN과 입력 파일의 대소문자 차이를 무시합니다.
답변2
고정 문자열 검색을 사용하는 grep
것은 매우 간단합니다. grep
다음 옵션을 사용하여 여러 스키마를 전달할 수 있습니다 -e
.
$ cat testfile
2019-02-11 00:05:58.241 [exec-178] Start request
2019-02-11 00:05:58.242 [exec-178] customer_name
2019-02-11 00:05:58.243 [exec-178] other process
2019-02-11 00:05:58.244 [exec-178] other process
2019-02-11 00:05:58.245 [exec-178] results
2019-02-11 00:05:58.246 [exec-178] End request (13ms)
$ grep -F -e 'customer_name' -e 'End request' testfile
2019-02-11 00:05:58.242 [exec-178] customer_name
2019-02-11 00:05:58.246 [exec-178] End request (13ms)
이 -F
옵션은 고정 문자열을 검색하도록 지정합니다. 이는 꼭 필요한 것은 아니지만 명령을 더 명확하게 만드는 데 도움이 됩니다.
확장 정규식을 사용하여 간단히 명령을 실행할 수도 있습니다. A|B 표현식은 "A" 또는 "B"를 검색합니다.
$ grep -E 'customer_name|End request' testfile
2019-02-11 00:05:58.242 [exec-178] customer_name
2019-02-11 00:05:58.246 [exec-178] End request (13ms)
답변3
별도의 줄에 있는 정확한 문자열을 반환하려는 경우:
egrep -o "customer_name|End request" logfile
산출:
customer_name
End request
전체 행을 반환하려면 다음을 수행하십시오.
egrep "customer_name|End request" logfile
산출
2019-02-11 00:05:58.242 [exec-178] customer_name
2019-02-11 00:05:58.246 [exec-178] End request (13ms)
답변4
검색 줄 사이(및 포함)의 모든 내용을 얻으려면 awk를 사용하십시오.
awk 'BEGIN {found=0}; /customer_name/ {found=1}; found {print}; /End request/ {found=0}' logfile
"customer_name"이 정적 문자열이 아니고 다른 값인 경우 -v
다음과 같이 사용해 보세요.
awk -v "name=sally" 'BEGIN {found=0}; index($0, name) {found=1}; found {print}; /End request/ {found=0}' logfile
또는 더 나은 형식과 설명이 있지만 복사하여 붙여넣기가 더 어렵습니다.
awk -v "name=sally" 'BEGIN {
# good style, but optional... nonexistent variables are already 0
found=0;
};
index($0, name) {
# remember that we found the first line
found=1;
};
found {
# since we print after the found=1, we print that line
# and also the lines between
# and since we set found=0 after already printing the end line, we are printing that too
print;
};
/End request/ {
# mark that we stop printing
found=0;
};' logfile