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 回答