我有一个文件,其中包含由特定流程生成的以下标题
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
。怎么去呢?感谢任何帮助。
答案 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
匹配 - 一个或多个数字 - 是唯一的输出。