0

输入文件:

GET /static_register_ad_request_1_2037_0_0_0_1_1_4_8335086462.gif?pa=99439_50491&country=US&state_fips_code=US_CA&city_name=Los%2BAngeles&dpId=2&dmkNm=apple&dmlNm=iPod%2Btouch&osNm=iPhone%2BOS&osvNm=5.1.1&bNm=Safari&bvNm=null&spNm=SBC%2BInternet%2BServices&kv=0_0&sessionId=0A80187E0138A0AE42E4DE3F783E7A08&sdk_version=4.0.5.6%20&domain=805AOEtUaMu&ad_catalog=99439_50491&make=APPLE&width=320&height=460&slot_type=PREROLL&model=iPod%20touch%205.1.1&iabcat=artsandentertainment&iabsubcat=music&age=113&gender=2&zip=92869 HTTP/1.1

输出文件:

domain  sdk_version

805AOEtUaMu 4.0.5.6%20

我可以sed -n 's/.*sdk_version=\([^&]*\).*domain=\([^&]*\).*/\1 \2/p'用来获取结果,但是第一列中的 sdk_version,我需要的是交换输出文件中的 sdk_version 和域列。

谁能帮我解决这个问题?提前非常感谢你:)

4

3 回答 3

1

只需交换您的反向引用:

sed -n 's/.*sdk_version=\([^&]*\).*domain=\([^&]*\).*/\2 \1/p'
于 2012-07-19T20:05:46.103 回答
0

一种使用方式awk

awk '
    BEGIN { 
        FS = "&";
    } 
    { 
        for ( i = 15; i <= 16; i++ ) { 
            split( $i, f, /=/ ); 
            printf( "%s ", f[2] ); 
        } 
    } 
    END { 
        printf "\n"; 
    }
' infile

输出:

4.0.5.6%20 805AOEtUaMu
于 2012-07-19T20:54:15.347 回答
0

如果你想处理任意顺序,我建议切换到awk或 Perl。

perl -ne 'm/[?&]domain=([^&]+)/ && $d = $1;
    m/[?&]sdk_version=([^&]+) && $s = $1;
    print "$d\t$s\n"' logfile
于 2012-07-19T20:59:25.950 回答