2017-04-10 47 views
0

我有一個文件,通過一定的工藝削減特定數量從URL在linux

Link: <https://rnd.corp.zoom/api/v3/repositories/99/issues?state=all&per_page=100&page=2>; rel="next", <https://rnd.corp.zoom/api/v3/repositories/99/issues?state=all&per_page=100&page=8>; rel="last" 

我想在上面的內容從page=8削減只是數8產生的頁眉下方。如何去做呢?感謝任何幫助。

+0

你有兩個鏈接,第一個在'page = 2'結束,第二個在'page = 8'。你只想要其中之一還是兩者? – ilkkachu

+0

我只想要打印'page = 8'中的'8'。基本上我需要從代碼中獲取頭部中的最後一頁。 – NewLands

回答

1

試試這個 -

$ cat f 
Link: <https://rnd.corp.zoom/api/v3/repositories/99/issues?state=all&per_page=100&page=2>; rel="next", <https://rnd.corp.zoom/api/v3/repositories/99/issues?state=all&per_page=100&page=8>; rel="last" 

$ awk -F'[&=<>]' '{for(i=1;i<=NF;i++) if($i ~ /^page$/) {print $(i+1)}}' f 
2 
8 

如果得到追加,那麼你將使用獲得的最後一個值低於awk:

$ awk -F'[&=<>]' '{for(i=1;i<=NF;i++) if($i ~ /^page$/) {kk=$(i+1)}} END{print kk}' ff 
8 

限制:目前你有網頁= 2和頁面= 8,上面的命令 將打印最後一頁值。

如果你總是要打印第2個值"8"(添加額外的行現有的網址,考慮到它將會不斷增加,你總是需要第二個值則低於使用) -

$ cat f 
Link: <https://rnd.corp.zoom/api/v3/repositories/99/issues?state=all&per_page=100&page=2>; rel="next", <https://rnd.corp.zoom/api/v3/repositories/99/issues?state=all&per_page=100&page=8>; rel="last" 
<https://rnd.corp.zoom/api/v3/repositories/99/issues?state=all&per_page=100&page=8>; rel="last" 

$ awk -v k=1 -F'[&=<>]' '{for(i=1;i<=NF;i++) if(($i ~ /^page$/) && (k==2)) {print $(i+1)} k++}' f 
8 
0

下面是使用grep實現:

grep -Po "&page=[0-9]*" <file_name> | grep -Po "[0-9]*" 

例子:

echo 'Link: <https://rnd.corp.zoom/api/v3/repositories/99/issues?state=all&per_page=100&page=2>; rel="next", <https://rnd.corp.zoom/api/v3/repositories/99/issues?state=all&per_page=100&page=8000>; rel="last"' | grep -Po "&page=[0-9]*" | grep -Po "[0-9]*" 
+0

謝謝@learningloop。這將同時打印2和8.我只想打印8.此外,該數字將在未來增加,併成爲兩位數字,三位數字等,有沒有可以想到的解決方案? – NewLands

+0

然後添加'|尾巴-1'將始終打印最後返回的頁碼。 – learningloop

0

這將產生預期的結果。

echo 'Link: <https://rnd.corp.zoom/api/v3/repositories/99/issues?state=all&per_page=100&page=2>; rel="next", <https://rnd.corp.zoom/api/v3/repositories/99/issues?state=all&per_page=100&page=12345>; rel="last"' | grep -Po "&page=[0-9]*" |grep -Po "[0-9]*"| awk '2 == NR % $ct' 
+1

我認爲這是使用grep,那些東西也可以用一個awk來完成。 – RavinderSingh13

+0

@ RavinderSingh13然後用awk命令分享它:P –

+0

我想我已經發布了1個相同的答案。 – RavinderSingh13

0

在awk中。 rev ERSE文字,刪除第一[0-9]+=egap,輸出和rev再次:

$ rev foo | awk 'sub(/[0-9]+=egap/,"")||1' |rev 

輸出:

Link: <https://rnd.corp.zoom/api/v3/repositories/99/issues?state=all&per_page=100&page=2>; rel="next", <https://rnd.corp.zoom/api/v3/repositories/99/issues?state=all&per_page=100&>; rel="last" 
0

嘗試:

awk '{gsub(/.*page=/,"page=");sub(/>.*/,"");print}' Input_file 

只需使用替代所有行*頁=到page =這是什麼,但會去直到最後一頁字符串(因爲*是一個貪婪的正則表達式匹配),所以然後用NULL替換>。*(意味着從>開始直到行尾),t母雞打印將是頁面= 8或頁面的最後一個值的行。當然,我正在考慮您的Input_file與示例中的示例相同。

0
awk -F'[= >]' '{print $12}' file 
8 
awk -F= '{split($8,a,">");print a[1]}' file 
8 
awk -F= '$8=="8>; rel"{print substr($8,1,1)}' file 
8 
+0

請提供您的代碼的解釋 – arghtype

0

一個貪婪正則表達式這裏需要(只有最後發生&page=應匹配),這一事實使簡單sed解決

sed -E 's/^.*&page=([0-9]+).*$/\1/' file 
  • ^.*&page=比賽一切達到最後發生的&page就行了。
  • ([0-9]+)匹配一個或多個數字,並且 - 由於(...)中的機櫃存儲了第一個(也是唯一)捕獲組中的匹配項,所以替換字符串將引用爲\1

  • .*$匹配該行上的任何剩餘字符。

  • 由於正則表達式匹配了整個行,因此\1只導致捕獲的數字作爲輸出。

上述工作既GNU和BSD/MacOS的sed,並充分利用現代擴展正則表達式(-E),但如果你需要POSIX兼容的解決方案(必須使用基本的正則表達式,因此更麻煩的):

sed 's/^.*&page=\([0-9]\{1,\}\).*$/\1/' file 

隨着GNUgrep(在Linux上,根據要求),單通grep -Po解決方案也是可能的;像sed解決方案,它依賴於貪婪地匹配到最後&page=

grep -Po "^.*&page=\K[0-9]+" file 
  • -P激活用於PRCEs (Perl-compatible Regular Expressions)支持。

  • -o只輸出該行的匹配部分。

  • \K刪除目前爲止所匹配的所有內容,以便[0-9]+匹配 - 一個或多個數字 - 是唯一的輸出。