我有一个大约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个值,也就足够了。
答案 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¬&interested&in¶m1=value1¶m2=value2¶m3=value3¶m4=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[^&?]+'