私には次のような記録があります
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