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