输入文件(HTTP请求日志文件):
GET /dynamic_branding_playlist.fmil?domain=915oGLbNZhb&pluginVersion=3.2.7_2.6&pubchannel=usa&sdk_ver=2.4.6.3&width=680& ; height = 290& embeddedIn = http%3A%2F%2Fviewster.com%2Fsplash%2FOscar-Videos-1.aspx%3Futm_source%3Dadon_272024_113535_24905_24905%26utm_medium%3Dcpc%26utm_campaign%3DUSYME%26adv%3D573900%26req%3D5006e9ce1ca8b26347b88a7.1.825& sdk_url = http%3A%2F%2Fdivaag.vo.llnwd.net%2Fo42%2Fhtt p_only%2Fviewster_com%2Fv25%2Fyume%2F& viewport = 42
输出文件:
域名sdk_version
915oGLbNZhb 2.4.6.3
成千上万的日志类似于上面的例子,所以我需要找到一种方法来提取domain& sdk_version的值。并且域和sdk_version的位置不固定。有时出现在2字段中,有时在最后一个字段中显示(如果用&分隔)。
有没有人可以帮我解决这个问题(使用sed命令)?非常感谢提前
答案 0 :(得分:1)
使用sed:
sed -n 's/.*domain=\([^&]*\).*sdk_ver=\([^&]*\).*/\1 \2/p' input_file
答案 1 :(得分:0)
使用awk
:
BEGIN {
FS = "[&?]"
printf "domain\tsdk_version\n"
}
{
for (i = 1; i <= NF; i++) {
split ($i, array, "=")
if (array[1] == "domain") {
printf array[2]
}
if (array[1] == "sdk_ver") {
printf "\t%s", array[2]
}
}
printf "\n"
}
或者作为一个单行:
awk -F "[&?]" 'BEGIN { printf "domain\tsdk_version\n" } { for (i = 1; i <= NF; i++) { split ($i, array, "="); if (array[1] == "domain") printf array[2]; if (array[1] == "sdk_ver") printf "\t%s", array[2]; } printf "\n"; }' file.txt
结果:
domain sdk_version
915oGLbNZhb 2.4.6.3
答案 2 :(得分:0)
这可能适合你(GNU sed):
sed 's/.*\<\(domain\)=\([^&]*\).*\<\(sdk_ver\)=\([^&]*\).*/\1 \3sion\n\2 \4/p;d' file