2014-01-06 171 views
0

我有一個約150行的文件,其中每行都是URL的一部分。我想從每一行中提取4個不同的參數,並將它們放入一個文件中。喜歡的東西:在Mac OS中使用awk或sed

/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 

心想這下ATLEAST讓我值1,但它只是返回的輸入文件是。我究竟做錯了什麼?另外,如何讓它返回所有四個值?我正在尋找關鍵字,pkw,idimp和premt。

編輯:預期的輸出是一個文件,其中包含輸入文件中150行中每一行的4個值。所以

keyword pkw1 idi premt1 

即使我只是得到4個不同文件中的4個值,它就足夠了。

+0

這將打印包含字符串'param1'的行和包含字符串'param2'的行之間的所有行的整體。如果只需要一部分線條,則需要一個動作語句,它可以完成與打印整行不同的操作。您可能也只想匹配包含所需參數的行(而不是行的範圍)。 –

+1

您的預期產量是多少? – anubhava

回答

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 "" 
    } 
' 
+0

完美!第一次嘗試! :) – CodingInCircles

+0

嘿格倫,昨天我得到了輸出,不得不做一些更多的事情,讓它按照我想要的方式得到它。雖然我沒有想到它會很容易,但我認爲有一個更簡單的方法。所以,我將4個關鍵字換行符分隔開來,並在每組4個末尾添加一個換行符。任何可以用製表符分隔和換行符分隔,或逗號和換行符分隔的方式?帶'paste -d「的 – CodingInCircles

+1

」 - - - -' -d選項定義字段之間的分隔符。如果你想用逗號,使用'-d,'。如果您需要選項卡,請省略該選項,因爲選項卡是粘貼的默認分隔符 –

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 
+0

我會避免'+'。如果有一個空值'param3 =&param4 = x',你會看到「損壞的」輸出。 –

+0

謝謝我編輯過,但如果2'&&'有任何機會出現的話''[&&] +''。 – anubhava

+0

感謝您的回答。我編輯了這個問題。你能否相應地編輯答案?我試着改變'[=&]'來包含一些模式匹配,但沒有按預期工作。 – CodingInCircles

0

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

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