매개변수를 사용하여 요청에 해당하는 모든 트래픽을 추출합니다.

매개변수를 사용하여 요청에 해당하는 모든 트래픽을 추출합니다.

access.log패턴이 있는 각 행에 대해 다음을 수행합니다 /mypattern.

www.example.com:80 192.0.2.17 - - [29/Sep/2017:13:49:02 +0200] "GET /mypattern?foo=bar&iptosearch=198.51.100.5  

iptosearch매개변수를 추출하고 해당 IP가 있는 모든 행을 표시하고 싶습니다.access.log그리고포함하는 blah. 예:

 [29/Sep/2017:13:49:02 +0200] "GET /mypattern?foo=bar&iptosearch=198.51.100.5: 
    www.example3.com:80 198.51.100.5 - - [27/Sep/2017:00:00:00 +0200] "GET /hello/blah" ...
    www.example2.com:80 198.51.100.5 - - [25/Sep/2017:00:00:00 +0200] "GET /blah.html" ...
    www.example7.com:80 198.51.100.5 - - [12/Sep/2017:00:00:00 +0200] "GET /index.htm?i=blah" ...

 [27/Sep/2017:00:00:00 +0200] "GET /mypattern?iptosearch=203.0.113.2&foo2=bar5: 
    www.example32.com:80 203.0.113.2 - - [15/Sep/2017:00:00:00 +0200] "GET /hello/blah" ...
    www.example215.com:80 203.0.113.2 - - [14/Sep/2017:00:00:00 +0200] "GET /blah.html" ...

나는 이것을하려고 노력하고 있습니다 :

grep -f <(grep -o 'mypattern.*iptosearch=(.*)' access.log) access.log |grep blah

하지만:

  • 이전 예처럼 정렬되지 않을 수 있습니다. 제목과 아래 목록은 관련 항목에 해당합니다.iptosearch

  • 내 예의 제목( )은 [29/Sep/2017:13:49:02 +0200] "GET /test?foo=bar&iptosearch=198.51.100.5:다음 내용을 포함하지 않기 때문에 표시되지 않습니다.blah

이전처럼 표시되도록 하려면 어떻게 해야 합니까?이 경우 루프를 사용해야 합니까?

답변1

확장하다세게 때리다+grep+방법:

샘플 access.log콘텐츠:

www.example3.com:80 198.51.100.5 - - [27/Sep/2017:00:00:00 +0200] "GET /hello/blah" ...
www.example2.com:80 198.51.100.5 - - [25/Sep/2017:00:00:00 +0200] "GET /blah.html" ...
[29/Sep/2017:13:49:02 +0200] "GET /mypattern?foo=bar&iptosearch=198.51.100.5: 
www.example7.com:80 198.51.100.5 - - [12/Sep/2017:00:00:00 +0200] "GET /index.htm?i=blah" ...
www.example32.com:80 203.0.113.2 - - [15/Sep/2017:00:00:00 +0200] "GET /hello/blah" ...
[27/Sep/2017:00:00:00 +0200] "GET /mypattern?iptosearch=203.0.113.2&foo2=bar5: 
www.example215.com:80 203.0.113.2 - - [14/Sep/2017:00:00:00 +0200] "GET /blah.html" ...

일하다:

grep '/mypattern' access.log | while read -r l; do 
    if [[ $l =~ iptosearch=(([0-9]+\.){3}[0-9]+) ]]; then 
        echo "$l"
        awk -v ip="${BASH_REMATCH[1]}" '$0~ip && /blah/;END{ print "" }' access.log
    fi
done

산출:

[29/Sep/2017:13:49:02 +0200] "GET /mypattern?foo=bar&iptosearch=198.51.100.5:
www.example3.com:80 198.51.100.5 - - [27/Sep/2017:00:00:00 +0200] "GET /hello/blah" ...
www.example2.com:80 198.51.100.5 - - [25/Sep/2017:00:00:00 +0200] "GET /blah.html" ...
www.example7.com:80 198.51.100.5 - - [12/Sep/2017:00:00:00 +0200] "GET /index.htm?i=blah" ...

[27/Sep/2017:00:00:00 +0200] "GET /mypattern?iptosearch=203.0.113.2&foo2=bar5:
www.example32.com:80 203.0.113.2 - - [15/Sep/2017:00:00:00 +0200] "GET /hello/blah" ...
www.example215.com:80 203.0.113.2 - - [14/Sep/2017:00:00:00 +0200] "GET /blah.html" ...

세부 사항:

  • while read -r l .../mypattern- 명령에서 반환된 줄을 반복합니다.grep

  • [[ $l =~ iptosearch=(([0-9]+\.){3}[0-9]+) ]]- 각 줄을 $l정규식과 일치시킵니다 iptosearch=(([0-9]+\.){3}[0-9]+). " " 이항 연산자에 의해 조건부 명령 에
    BASH_REMATCH멤버가 할당된 배열 변수입니다 . 인덱스가 있는 요소는 전체 정규식과 일치하는 문자열 부분입니다. 인덱스가 있는 요소는 첫 번째 대괄호 내의 하위 표현식과 일치하는 문자열 부분 입니다. 이 변수는 읽기 전용입니다.=~[[0nn(...)

  • -v ip="${BASH_REMATCH[1]}"- 변수를 전달합니다 ip.스크립트

  • $0~ip && /blah/- ip현재 값과 키워드를 포함하는 출력 라인 만blah

답변2

awk '/blah/ && $2 == "198.51.100.5" { print }' access.log

blah라는 텍스트가 포함된 모든 줄을 검색합니다. 두 번째 공백으로 구분된 필드도 "198.51.100.5"인 경우 해당 줄을 인쇄합니다.

관련 정보