2014-10-03 28 views
1

我有這個sed來增加每個匹配自己的行

awk -F=":" -v RS="," '$1~/"name"/ {print}' | sed -e 's/^.*"name"[ ]*:[ ]*"//' -e 's/".*//'` 

user1 user2 user3 user4 user5 

我想補充並排

user1 
user2 
user3 
user4 
user5 

上創建自己的路線,而不是側面每場比賽對於的方式獎金,有沒有辦法告訴awk和sed跳過「名字」的第一場比賽?

這是從API

{ 
    "name": "users", 
    "self": "http://", 
    "users": { 
    "size": 5, 
    "items": [ 
     { 
     "self": "http://", 
     "name": "admin", 
     "emailAddress": "[email protected]", 
     "avatarUrls": { 

     }, 
     "displayName": "admin", 
     "active": true 
     }, 
     { 
     "self": "http://", 
     "name": "user1", 
     "emailAddress": "[email protected]", 
     "avatarUrls": { 

     }, 
     "displayName": "user1", 
     "active": true 
     }, 
     { 
     "self": "http://", 
     "name": "user2", 
     "emailAddress": "[email protected]", 
     "avatarUrls": { 

     }, 
     "displayName": "user2", 
     "active": true 
     }, 
     { 
     "self": "http://", 
     "name": "user3", 
     "emailAddress": "[email protected]", 
     "avatarUrls": { 

     }, 
     "displayName": "user3", 
     "active": true 
     } 
    ], 
    "max-results": 50, 
    "start-index": 0, 
    "end-index": 3 
    }, 
    "expand": "users" 
} 
+1

什麼是你的輸入?另外'-F =「:''將你的'FS'設置爲'=:'不''',就像你可能期待的那樣。使用'-F:'或'-v FS =:'。 – 2014-10-03 20:44:31

+3

另外一般情況下,如果您使用'awk | sed'你做錯了什麼。 awk幾乎可以肯定地做你想要的東西。 – 2014-10-03 20:45:15

+0

輸入是來自休息api的JSON響應,它有額外的信息,所以我想獲取用戶名 – jquerynoob 2014-10-03 20:48:55

回答

2

輸出只使用awk解釋樣品JSON數據:

$ awk -F: -v RS="," '$1~/"name"/ && f {gsub("[ \",]", "", $2); print $2} $1~/"name"/{f=1}' json 
admin 
edwin 
niwde 
other 

name的第一匹配被跳過由於標誌f

awk代碼說明:

  • $1~/"name"/ && f {gsub("[ \",]", "", $2); print $2}

    這包括一個條件和一組語句的。條件要求第一個字段匹配"name"標誌f非零。如果這兩個條件都滿足,則從相同的第二個字段中刪除空格,引號和逗號,並打印第二個字段。

    awk中,變量的默認值爲零(或空白)。因此,除非我們指定f爲非零值,否則不會打印任何內容。

  • $1~/"name"/{f=1}

    如果第一字段上"name"匹配,則該標誌f設置爲1。因此,f未設置爲1,直到看到名字字段。因此,第一個名稱字段將不會被打印,但會在後面完成。

+0

謝謝你,這很好,併爲你的解釋。我將如何去添加每個單獨的行中的名稱? – jquerynoob 2014-10-04 05:57:37

+1

@jquerynoob對於我來說,每個名字都在單獨的行上打印,就像我的答案中的示例輸出中所示。它不適合你嗎?或者,你在問別的東西嗎? – John1024 2014-10-04 07:11:16

+0

你是對的我有其他錯誤。謝謝。 – jquerynoob 2014-10-06 16:46:49

2

你可以試試這個sed的

sed -n '/"name": "/{s/ *"name": "\([^"]*\)",/\1/;p}' YourFile 
+0

做得很好。如果你願意的話,你可以通過'tail -n + 2'來過濾掉這個命令,以消除OP的「獎勵」所需的第一場比賽。另外sed命令可以簡化爲'sed -n's/*「name」:「\([^」] * \)「,/ \ 1/p'' – John1024 2014-10-03 21:24:27