나에겐 다음과 같은 기록이 있다
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