2017-04-10 54 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]+匹配 - 一个或多个数字 - 是唯一的输出。