原来的日志文件示例:
“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& 视= 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和视口的第四个参数?
非常感谢提前:)
只需用awk
gawk 'match($0, /&viewport=[0-9]+,[0-9]+,([0-9]+),([0-9]+)/, m){print m[1], m[2]}'
注:第三个参数match
仅提供gawk
,所以这个脚本是呆子特定的。 说明:我们提供的正则表达式match
功能,捕捉在第三和第四场viewport
。 match
如果提供的正则表达式可以针对整个记录的一些子串匹配成功返回非零值。 然后,它只是打印捕获组。
你剥夺了右外场,现在喂输出到另一个工具:
sed ...... | awk -F, '{print $3, $4}'
或者,如果你想使用grep和切工(哎,不是一切都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
使用它可以做什么我之前说的(虽然你不需要这个最新加入)。
使用一种方法grep
, perl
正则表达式和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
唯一的解决办法,我可以更容易选择感兴趣的视场。 如果你想的第五和第六字段,只需将改变array[1 + 3], array[1 + 4]
到array[1 + 5], array[1 + 6]
此外,这些解决方案必须找到每行多次出现的额外优势。
另一个awk
-只解决方案:
awk '{split($0,a,"viewport=");split(a[2],b,",");print b[3],b[4]}' filename
产量
971 0
此拆分使用字符串输入线"viewport="
到名为阵列a
,并采取该阵列的元件a
包含后的数据"viewport="
并将它分为数组b
,然后打印出我们的元素有兴趣。