2012-07-19 86 views
0

输入文件:交换输出中的2个柱子---- Sed或Awk?

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在第一列,我需要的是掉在OUTPUTFILE的sdk_version和域列。

任何人都可以帮助我吗?非常感谢你提前:)

+0

我编辑了这个问题,因为粗体字符不能在代码标签内工作,所以* * *和* sdk_version *字词之间的**会使正则表达式失败。 – Birei 2012-07-19 20:29:35

+0

在'sed'正则表达式的替换部分使用'/ \ 2 \ 1 /'? – 2012-07-19 20:58:54

+0

请不要编辑 - 删除自己的问题,这对那些花时间回答并增加社区知识的人来说并不友好。如果由于某种原因,您确实无法忍受这种情况,请联系版主。 – Tim 2012-08-15 20:50:51

回答

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 
1

只要将您的反向引用:

sed -n 's/.*sdk_version=\([^&]*\).*domain=\([^&]*\).*/\2 \1/p' 
0

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

perl -ne 'm/[?&]domain=([^&]+)/ && $d = $1; 
    m/[?&]sdk_version=([^&]+) && $s = $1; 
    print "$d\t$s\n"' logfile