grep 直到最后一个 url 端点
grep until the last url endpoint
比方说,我有包含以下链接的文件:
https://example.com/endpoint1
https://example.com/endpoint1/endpoint2/endpoint3
https://example.com/endpoint1/endpoint2
https://example.com/endpoint1/endpoint2/file.js
https://example.com/endpoint1/?url=test
我需要 grep 直到最后一个端点,在我的例子中可能是端点 1 或端点 2 或端点 3。
我使用 sed
和 awk
,但它匹配第一个匹配而不是最后一个
cut -d / -f 1
awk -F_ '{print }'
两个命令只匹配第一个/
更新:-
期望的输出是
https://example.com/endpoint1
https://example.com/endpoint1/endpoint2
https://example.com/endpoint1/endpoint2/endpoint3
任何帮助!!
试试这个:
cat yourdata.txt | egrep '^https://example\.com(/endpoint[1-3])+$'
您可以考虑这个awk
解决方案:
awk '{sub(/\/?\?.*|\/[^\/.]+\..[^\/]*$/, "")} !seen[[=10=]]++' file
https://example.com/endpoint1
https://example.com/endpoint1/endpoint2/endpoint3
https://example.com/endpoint1/endpoint2
sub
函数删除查询字符串或 URL 的最后一个组件(如果其中包含 dot
。
!seen[[=14=]]++
打印唯一的 URLs 跳过重复项。
grep -Po '.*/endpoint[1-3](?=/|\r|$)' file | sort -u
使用您显示的示例,请尝试执行以下 awk
程序。将字段分隔符设置为 /
如果最后一个字段等于点或?然后减少字段数并打印行(如果数组中尚未列出)。然后检查最后一个字段是否不等于点和 ?
,然后确保它只打印唯一的行。
awk '
BEGIN{
FS=OFS="/"
}
($NF~/\./ || $NF~/\?/){
NF--
if(!seen[[=10=]]++){ print }
}
($NF!~/\./ && $NF!~/\?/) && !seen[[=10=]]++
' Input_file
第二个解决方案: 使用 sed
+ sort
并在此处使用 anubhava 的答案正则表达式:
sed -E 's/\/?\?.*|\/[^\/.]+\..[^\/]*$//' Input_file | sort -u
以下内容之一可能是您要查找的内容,具体取决于 的答案:
awk '([=10=] !~ "/[^/]*[^[:alnum:]/]+[^/]*$") && !seen[[=10=]]++' file
awk '{sub("/[^/]*[^[:alnum:]/]+[^/]*$","")} !seen[[=10=]]++' file
两者的行为相同,并根据您提供的输入生成您提供的输出,但在给定额外输入行的情况下,请注意两者之间的行为差异:
$ cat file
https://example.com/endpoint1
https://example.com/endpoint1/endpoint2/endpoint3
https://example.com/endpoint1/endpoint2
https://example.com/endpoint1/endpoint2/file.js
https://example.com/endpoint1/?url=test
https://example.com/endpoint4/?url=test
$ awk '([=12=] !~ "/[^/]*[^[:alnum:]/]+[^/]*$") && !seen[[=12=]]++' file
https://example.com/endpoint1
https://example.com/endpoint1/endpoint2/endpoint3
https://example.com/endpoint1/endpoint2
$ awk '{sub("/[^/]*[^[:alnum:]/]+[^/]*$","")} !seen[[=13=]]++' file
https://example.com/endpoint1
https://example.com/endpoint1/endpoint2/endpoint3
https://example.com/endpoint1/endpoint2
https://example.com/endpoint4
比方说,我有包含以下链接的文件:
https://example.com/endpoint1
https://example.com/endpoint1/endpoint2/endpoint3
https://example.com/endpoint1/endpoint2
https://example.com/endpoint1/endpoint2/file.js
https://example.com/endpoint1/?url=test
我需要 grep 直到最后一个端点,在我的例子中可能是端点 1 或端点 2 或端点 3。
我使用 sed
和 awk
,但它匹配第一个匹配而不是最后一个
cut -d / -f 1
awk -F_ '{print }'
两个命令只匹配第一个/
更新:- 期望的输出是
https://example.com/endpoint1
https://example.com/endpoint1/endpoint2
https://example.com/endpoint1/endpoint2/endpoint3
任何帮助!!
试试这个:
cat yourdata.txt | egrep '^https://example\.com(/endpoint[1-3])+$'
您可以考虑这个awk
解决方案:
awk '{sub(/\/?\?.*|\/[^\/.]+\..[^\/]*$/, "")} !seen[[=10=]]++' file
https://example.com/endpoint1
https://example.com/endpoint1/endpoint2/endpoint3
https://example.com/endpoint1/endpoint2
sub
函数删除查询字符串或 URL 的最后一个组件(如果其中包含dot
。!seen[[=14=]]++
打印唯一的 URLs 跳过重复项。
grep -Po '.*/endpoint[1-3](?=/|\r|$)' file | sort -u
使用您显示的示例,请尝试执行以下 awk
程序。将字段分隔符设置为 /
如果最后一个字段等于点或?然后减少字段数并打印行(如果数组中尚未列出)。然后检查最后一个字段是否不等于点和 ?
,然后确保它只打印唯一的行。
awk '
BEGIN{
FS=OFS="/"
}
($NF~/\./ || $NF~/\?/){
NF--
if(!seen[[=10=]]++){ print }
}
($NF!~/\./ && $NF!~/\?/) && !seen[[=10=]]++
' Input_file
第二个解决方案: 使用 sed
+ sort
并在此处使用 anubhava 的答案正则表达式:
sed -E 's/\/?\?.*|\/[^\/.]+\..[^\/]*$//' Input_file | sort -u
以下内容之一可能是您要查找的内容,具体取决于
awk '([=10=] !~ "/[^/]*[^[:alnum:]/]+[^/]*$") && !seen[[=10=]]++' file
awk '{sub("/[^/]*[^[:alnum:]/]+[^/]*$","")} !seen[[=10=]]++' file
两者的行为相同,并根据您提供的输入生成您提供的输出,但在给定额外输入行的情况下,请注意两者之间的行为差异:
$ cat file
https://example.com/endpoint1
https://example.com/endpoint1/endpoint2/endpoint3
https://example.com/endpoint1/endpoint2
https://example.com/endpoint1/endpoint2/file.js
https://example.com/endpoint1/?url=test
https://example.com/endpoint4/?url=test
$ awk '([=12=] !~ "/[^/]*[^[:alnum:]/]+[^/]*$") && !seen[[=12=]]++' file
https://example.com/endpoint1
https://example.com/endpoint1/endpoint2/endpoint3
https://example.com/endpoint1/endpoint2
$ awk '{sub("/[^/]*[^[:alnum:]/]+[^/]*$","")} !seen[[=13=]]++' file
https://example.com/endpoint1
https://example.com/endpoint1/endpoint2/endpoint3
https://example.com/endpoint1/endpoint2
https://example.com/endpoint4