現場で2回カット

現場で2回カット

私には次のような記録があります

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 ) ==単語を振り返るGETspace
.* ==前方になるまで振り返った後の文字を0回以上一致させます。
(?=".*"http)== "&&any char zero or more timesフロントビュー"http

関連情報