1

sed でログ prase を解析しようとしています:

echo 195.236.222.1 - - [24/Jul/2012:07:35:25 +0300] "GET / HTTP/1.1" 200 387 "http://www.google.fi/url?sa=t&rct=j&q=tarinat&source=web&cd=9&ved=0CGoQFjAI&url=http%3A%2F%2Fwww.suomi24.fi%2F&ei=XyQOUKi0CeWA4gTjz4D4Cg&usg=AFQjCNE6wg5zPXup3d3PRoqU-BtpiNCccw" "Mozilla/5.0 (Windows NT 6.1; rv:13.0) Gecko/20100101 Firefox/13.0.1" |
sed -r 's/.*(\&q=.*)\&.*/\1/'

「&q=tarinat」を取得したいのですが、残念ながら:

\&q=tarinat&source=web&cd=9&ved=0CGoQFjAI&url=http%3A%2F%2Fwww.suomi24.fi%2F&ei=XyQOUKi0CeWA4gTjz4D4Cg

最後まで文字列全体を取得する理由がわかりません。任意の支援やヒントをいただければ幸いです。

4

3 に答える 3

3

正規表現.*は貪欲です。貪欲になりたくないので、おそらく次のように書く必要があります。

sed -r 's/.*(\&q=[^&]*)\&.*/\1/'
于 2012-07-24T23:51:40.653 に答える
3

.*かなり貪欲です。[^&]*これを、文字以外のすべてに一致するという否定的な文字一致に&置き換えることができます

echo 195.236.222.1 - - [24/Jul/2012:07:35:25 +0300] "GET / HTTP/1.1" 200 387 "http://www.google.fi/url?sa=t&rct=j&q=tarinat&source=web&cd=9&ved=0CGoQFjAI&url=http%3A%2F%2Fwww.suomi24.fi%2F&ei=XyQOUKi0CeWA4gTjz4D4Cg&usg=AFQjCNE6wg5zPXup3d3PRoqU-BtpiNCccw" "Mozilla/5.0 (Windows NT 6.1; rv:13.0) Gecko/20100101 Firefox/13.0.1" |
sed -r 's/.*(\&q=[^&]*)\&.*/\1/'
于 2012-07-24T23:51:50.200 に答える
1

を使用した簡単な方法grep

grep -o "&q=[^&]*"

結果:

&q=tarinat
于 2012-07-24T23:55:02.447 に答える