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。 我使用 sedawk,但它匹配第一个匹配而不是最后一个

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