1

入力ファイル (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%24mcutmedium_6pccut_24905%24905 %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%2Fyumeport%2F&view

出力ファイル:

ドメイン sdk_version

915oGLbNZhb 2.4.6.3

上記の例と同様の数千のログがあるため、domain&sdk_version の値を抽出する方法を見つける必要があります。また、domain と sdk_version の位置は固定ではありません。2 番目のフィールドに表示されることもあれば、最後のフィールドに表示されることもあります (& で分割されている場合)。

誰でもこの問題を解決できますか (sed コマンドを使用)。どうもありがとうございました

4

3 に答える 3

1

sed の使用:

sed -n 's/.*domain=\([^&]*\).*sdk_ver=\([^&]*\).*/\1 \2/p' input_file
于 2012-07-19T05:05:59.210 に答える
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
于 2012-07-19T05:25:02.497 に答える
0

これはうまくいくかもしれません(GNU sed):

sed 's/.*\<\(domain\)=\([^&]*\).*\<\(sdk_ver\)=\([^&]*\).*/\1 \3sion\n\2 \4/p;d' file
于 2012-07-19T05:58:25.527 に答える