현장에서 두 번 자르기

현장에서 두 번 자르기

나에겐 다음과 같은 기록이 있다

192.168.28.168  user82  [08/May/2010:09:52:52]  "GET /NoAuth/js/titlebox-state.js HTTP/1.1"     "http://www.example.com/index.html"     "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 GTB7.0" 

최종 출력이 표시되기를 원합니다.

   /NoAuth/js/titlebox-state.js HTTP/1.1

이 명령을 사용하면 다음을 얻을 수 있습니다

cut -f4 example.log

"GET /NoAuth/js/titlebox-state.js HTTP/1.1"

그러나 ["GET]도 제거해야 합니다. 이를 수행하려면 cut, awk 또는 sed를 어떻게 사용합니까?

답변1

Awk방법:

awk '{ sub(/"/, "", $6); print $5, $6 }' file

산출:

/NoAuth/js/titlebox-state.js HTTP/1.1

답변2

Sed방법:

sed -n 's/.*"GET \([^ ]* HTTP\/[0-9\.]*\)".*/\1/p' example.log

*"GET (<no-whitespaces> HTTP/<digits-and-dots>)"*괄호 안의 일치 항목을 검색 하고 반환합니다.

답변3

Perl 정규 표현식을 사용하는 대안 gnu grep:

$ echo "$a"
192.168.28.168  user82  [08/May/2010:09:52:52]  "GET /NoAuth/js/titlebox-state.js HTTP/1.1"     "http://www.example.com/index.html"     "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 GTB7.0"

$ echo "$a" |grep -Po '(?<=GET ).*(?=".*"http)'
/NoAuth/js/titlebox-state.js HTTP/1.1
$#or
$ echo "$a" |grep -Po '(?<=GET).*(?=".*"http)'
 /NoAuth/js/titlebox-state.js HTTP/1.1 #leading space preserved

(?<=GET ) == 단어 뒤돌아보기 GET& space
.* == 앞보기가 될 때까지 뒤돌아보기 이후 문자를 0회 이상 일치시킵니다.
(?=".*"http)== "& any char zero or more times& 앞보기"http

관련 정보