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
멤버가 할당된 배열 변수입니다 . 인덱스가 있는 요소는 전체 정규식과 일치하는 문자열 부분입니다. 인덱스가 있는 요소는 첫 번째 대괄호 내의 하위 표현식과 일치하는 문자열 부분 입니다. 이 변수는 읽기 전용입니다.=~
[[
0
n
n
(...)
-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"인 경우 해당 줄을 인쇄합니다.