Awk
abordagem:
awk '{ sub(/"/, "", $6); print $5, $6 }' file
A saída:
/NoAuth/js/titlebox-state.js HTTP/1.1
Eu tenho um registro como
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"
Eu quero que a saída final seja apenas como exibição
/NoAuth/js/titlebox-state.js HTTP/1.1
Eu uso este comando e consigo o seguinte
cut -f4 example.log
"GET /NoAuth/js/titlebox-state.js HTTP/1.1"
mas, eu preciso remover ["GET] também, como posso fazer isso com cut ou awk ou sed?
Awk
abordagem:
awk '{ sub(/"/, "", $6); print $5, $6 }' file
A saída:
/NoAuth/js/titlebox-state.js HTTP/1.1
Sed
abordagem:
sed -n 's/.*"GET \([^ ]* HTTP\/[0-9\.]*\)".*//p' example.log
Ele procura *"GET (<no-whitespaces> HTTP/<digits-and-dots>)"*
e retorna correspondências entre parênteses.
Abordagem alternativa com regexps gnu grep
e Perl:
$ 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 )
== lookbehind para a palavra GET
& space
.*
== corresponde a qualquer caractere zero ou mais vezes após lookbehind e até lookahead
(?=".*"http)
== lookahead para "
& any char zero or more times
& "http