从linux中的url中删除一个特定的数字

时间:2017-04-10 09:12:58

标签: linux awk

我有一个文件,其中包含由特定流程生成的以下标题

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"

我想在上述内容中仅从8剪切page=8。怎么去呢?感谢任何帮助。

7 个答案:

答案 0 :(得分: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
  

限制:目前您有page = 2和page = 8及以上命令   将打印最后一页的值。

如果你总是想要打印第二个值"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

答案 1 :(得分: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]*"

答案 2 :(得分: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'

答案 3 :(得分:0)

在awk中。 rev删除文字,先删除[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"

答案 4 :(得分:0)

尝试:

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

简单地用。* page = to page =替换整行。这只是最后一页字符串(因为*是贪婪的正则表达式匹配),所以然后替换&gt;。*(表示从&gt;开始使用NULL,然后打印将是page = 8或页面的最后一个值的行。当然我在考虑你的Input_file与显示的例子相同。

答案 5 :(得分: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

答案 6 :(得分:0)

此处需要贪婪正则表达式(仅匹配&page= last 匹配项)这一事实使成为一个简单的{{1解决方案

sed
  • sed -E 's/^.*&page=([0-9]+).*$/\1/' file 匹配该行上 last 出现的^.*&page=的所有内容。
  • &page匹配一个或多个数字,并且 - 由于([0-9]+)中的机箱将匹配存储在第一个(也是唯一的)捕获组中,替换字符串随后引用为{{ 1}}。

  • (...)匹配该行上任何剩余的字符。

  • 由于正则表达式匹配整个行,因此\1只会将捕获的数字作为输出。

以上工作同时使用GNU和BSD / macOS .*$ 并利用现代扩展正则表达式(\1),但是如果您需要符合POSIX标准的解决方案(必须使用基本正则表达式,因此更麻烦):

sed

使用 GNU -E (在Linux上,根据要求),也可以使用单通sed 's/^.*&page=\([0-9]\{1,\}\).*$/\1/' file 解决方案;与grep解决方案一样,它依赖于贪婪地匹配 last grep -Po

sed
  • &page=激活对PRCEs (Perl-compatible Regular Expressions)的支持。

  • grep -Po "^.*&page=\K[0-9]+" file 仅输出该行的匹配部分。

  • -P会删除到目前为止匹配的所有内容,以便-o匹配 - 一个或多个数字 - 是唯一的输出。