여러 줄에서 정보를 수집하는 방법은 무엇입니까?

여러 줄에서 정보를 수집하는 방법은 무엇입니까?

다음 데이터가 포함된 로그 파일이 있습니다.

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

관련 정보