2

原始日志文件示例:

"GET /dynamic_preroll_playlist.fmil?domain=13nwuc&width=480&height=360&imu=medrect&pubchannel=filmannex&ad_unit=category_2&sdk_ver=2.4.1.3&embeddedIn=http%3A%2F%2Fwww.filmannex.com%2Fmovie%2Fend-of-the-tunnel%2F20872&sdk_url= http%3A%2F%2Fstatic2.filmannex.com%2Fflash%2F& viewport=10,261,971,0,971,0,10,261 HTTP/1.1", 200, 201, 1516, 16363, " http://static2.filmannex.com/flash/ yume_ad_library.swf", pl.networks.com, "Mozilla/4.0(兼容;MSIE 7.0;Windows NT 6.0;FunWebProducts;GTB7.3;SLCC1;.NET CLR 2.0.50727;.NET CLR 3.5.30729;.NET CLR 3.0.30618 ; FunWebProducts的; .NET4.0C) “ ”24_100_150_188_jZKFKQQjdRNM6e“, ”0rO0ABXd8AAAACgAAASQAAAaLAAAGiwAAASgAAAaLAAAGiwAAAVoAAAaLAAAGiwAAAVkAAAaKAAAGiwAAAdwAAAaKAAAGiwAAAhIAAAaKAAAGiwAAAhUAAAaKAAAGiwAAAhYAAAaKAAAGiwAAAhsAAAaKAAAGiwAAAiwAAAaKAAAGiw **“, ” - “, ” - “, ”@ YD_1; 233_2739“, - , ” - “, ”24.100.150.188“,” 199.127。 205.6"

所需的输出是第三和第四视口:

971 0

我使用了命令:

sed -n 's/.*viewport=\([^&]*\)/\1 /p' filename

得到错误的输出:10,261,971,0,971,0,10,261** HTTP/1.1", 200, 201, 1516, 16363, .....后面有太多冗余信息。

谁能帮我解决这个问题?使用 sed 命令获取视口的第 3 和第 4 个参数?

提前非常感谢:)

4

5 回答 5

2

您剥离了正确的字段,现在将输出提供给另一个工具:

sed ...... | awk -F, '{print $3, $4}'
于 2012-08-07T22:55:00.503 回答
2

或者,如果您想使用 grep 和 cut(嘿,并非所有内容都有 sed 和 awk):

grep -o "&viewport=[0-9,]*" filename | grep -o "[0-9,]*" | cut -d "," -f 3,4

或者您可以使用之前的命令并将其传递给同一个剪辑。

sed -n 's/.*viewport=\([^&]*\) /\1/p' sedtest | cut -d "," -f 3,4

此外,它捕获其余文本的原因是因为您只用数字替换了开头的所有内容,而将所有内容留在了结尾。如果您只想捕获视口参数,则需要替换整个字符串,而不仅仅是开头。还要在否定字符集中添加一个空格以在其后停止。

sed -n 's/.*viewport=\([^& ]*\).*/\1/p' sedtest

用它你可以做我之前说的(虽然你不需要这个最新的添加)。

于 2012-08-07T22:59:47.173 回答
1

使用grepperlregex 和awk在管道中的一种方法:

< file.txt grep -oP "viewport=[^ ]+" | awk -F "[=,]" '{ print $3, $4 }'

一种使用方式awk

awk -v RS="viewport=[^ ]+" 'RT != "" { split (RT,array,"[=,]"); print array[1 + 3], array[1 + 4] }' file.txt

编辑:

awk唯一的解决方案中,我可以更轻松地选择感兴趣的视口字段。如果您想要第 5 和第 6 个字段,只需将 更改array[1 + 3], array[1 + 4]array[1 + 5], array[1 + 6]。此外,这些解决方案还有一个额外的优势,即每行查找多次出现。

于 2012-08-07T23:40:08.033 回答
1

另一个awk唯一的解决方案:

awk '{split($0,a,"viewport=");split(a[2],b,",");print b[3],b[4]}' filename

产量

971 0

这将使用字符串的输入行拆分"viewport="为一个名为 的数组a,并获取a包含其后 "viewport="数据的数组元素并将其拆分为数组b,然后打印出我们感兴趣的元素。

于 2012-08-08T00:03:46.280 回答
-1

只需使用 awk

gawk 'match($0, /&viewport=[0-9]+,[0-9]+,([0-9]+),([0-9]+)/, m){print m[1], m[2]}'

注意:第三个参数 tomatch仅在 中可用gawk,所以这个脚本是 gawk 特定的。说明:我们为match函数提供正则表达式,它捕获viewport. match如果提供的正则表达式可以与整个记录的某个子字符串成功匹配,则返回非零值。然后它只打印捕获的组。

于 2012-08-07T22:56:16.117 回答