在Mac OS中使用awk或sed

时间:2014-01-06 19:23:31

标签: macos bash sed awk

我有一个大约150行的文件,其中每一行都是URL的一部分。我想从每一行中提取4个不同的参数并将它们放入一个文件中。类似的东西:

/secure/domain/new.aspx?id=620&utm_source=1034&utm_medium=cpc&utm_term=term1&try=1&v=3&utm_account=account_name&utm_campaign=campaign_name&utm_adgroup=adgroup&keyword=keyword1&pkw=pkw1&idimp=id&premt=premt1&gclid=id

作为试验,我做了

awk '/pkw/,/&idimp/' file > output.txt

认为这至少会让我获得value1,但它只是按原样返回输入文件。我究竟做错了什么?另外,如何让它返回所有四个值?我想获得关键字,pkw,idimp和premt。

编辑:预期输出是一个文件,其中包含输入文件中150行中每一行的4个值。所以

 keyword pkw1 idi premt1

即使我只是在4个不同的文件中获得4个值,也就足够了。

3 个答案:

答案 0 :(得分:1)

你可以使用这个awk:

awk -F'[=&]' '{print $2, $4, $6, $8}' file
value1 value2 value3 value4

将输出重定向到文件:

awk -F'[=&]' '{print $2, $4, $6, $8}' file > output.txt

编辑:根据您编辑的问题,您可以使用:

awk -F'[=&]' '{n=1; for (i=1; i<=NF; i++) {if ($i=="interested") {n=i+3; break}}
      for (i=0; i<8; i+=2) printf $(n+i) " "; print ""}' file
value1 value2 value3 value4 

答案 1 :(得分:1)

s='/helloworld/some/other/standard/URL/mumbo/jumbo/page.aspx?strings&that&I&am&not&interested&in&param1=value1&param2=value2&param3=value3&param4=value4&some&more&uninteresting&strings'
echo "$s" | grep -o 'param[1234]=[^&]*' | cut -d= -f2- | paste -d " " - - - -
value1 value2 value3 value4

跟上问题的澄清:

s='/secure/domain/new.aspx?id=620&utm_source=1034&utm_medium=cpc&utm_term=term1&try=1&v=3&utm_account=account_name&utm_campaign=campaign_name&utm_adgroup=adgroup&keyword=keyword&pkw=pkw1&idimp=id&premt=premt1&gclid=id'
echo "$s" |  grep -o '\<\(keyword\|pkw\|idimp\|premt\)=[^&]*' | cut -d= -f2- | paste -d " " - - - -
keyword pkw1 id premt1

\<是一个“单词开头”锚点,以避免匹配“fookeyword”之类的参数

用awk,我写道:

awk -F '[?=&]' '
    BEGIN {
        # initialize the parameters you want
        p["keyword"] = p["pkw"] = p["idimp"] = p["premt"] = 1
    } 
    {
        for (i=2; i<NF; i+=2) 
            if ($i in p) 
                printf "%s ", $(i+1)
        print ""
    }
'

答案 2 :(得分:0)

或者只是grep -P,但这可能需要安装GNU grep。

grep -oP '[?&][^&?=]+=\K[^&?]+'