如何在Bash中获得http链接的最后一部分?


25

我有一个http链接:

http://www.test.com/abc/def/efg/file.jar 

我想将最后一部分file.jar保存为变量,因此输出字符串为“ file.jar”。

条件:链接可以具有不同的长度,例如:

http://www.test.com/abc/def/file.jar.

我尝试过这种方式:

awk -F'/' '{print $7}'

,但问题是URL的长度,因此我需要一个可用于任何URL长度的命令。

Answers:


51

使用awk它可以工作,但这有点像是用榴弹炮猎鹿。如果您已经裸露了URL,那么将其放入shell变量并使用bash内置参数替换就很简单了:

$ myurl='http://www.example.com/long/path/to/example/file.ext'
$ echo ${myurl##*/}
file.ext

这是通过删除贪婪地匹配“ * /”的前缀来实现的,这是##操作员要做的:

${haystack##needle} # removes any matching 'needle' from the
                    # beginning of the variable 'haystack'

有什么解释吗?
Questionmark

当然。可以吗?
DopeGhoti '16

太好了:)
Questionmark

2
如果要剥离查询字符串,则可以首先分配一个中间变量,例如file=${myurl##*/},然后使用贪婪反向匹配备份到?(不要忘记转义!),例如echo ${file%%\?*}
Doktor J

21

basename并且也dirname适用于URL:

> url="http://www.test.com/abc/def/efg/file.jar"
> basename "$url"; basename -s .jar "$url"; dirname "$url"
file.jar
file
http://www.test.com/abc/def/efg

+1出色,它可以工作,因为URL和PATH以及两个URI。
图兰斯·科尔多瓦

1
@TulainsCórdova路径不是URI;这工作,因为basenamedirname分割字符串的/,这正好与网址的工作太多,至少只要他们没有本地部分(不与一般的URI虽然)。
史蒂芬·基特

在维基百科的文章有关URI,他们给下面的URI引用的有效例子:/relative/URI/with/absolute/path/to/resource.txtrelative/path/to/resource.txt../../../resource.txtresource.txt en.wikipedia.org/wiki/...
Tulains科尔多瓦

1
@TulainsCórdovaWikipedia没错,/relative/path可以是文件系统路径,也可以是相对URI。但是,这取决于背景。当用作文件系统路径时,它不是URI。用作URI时,它不是文件系统路径。说它是URI只是因为它碰巧与语法匹配,就像说此注释中的每个单词也是URI一样。
hvd

11

使用awk,您可以使用$NF来获取最后一个字段,而与字段数无关:

awk -F / '{print $NF}'

如果将该字符串存储在shell变量中,则可以使用:

a=http://www.test.com/abc/def/efg/file.jar
printf '%s\n' "${a##*/}"

6

大多数发布的答案对于包含查询字符串或目标的URL都不可靠,例如以下内容:

https://example.com/this/is/a/path?query#target

Python在其标准库中具有URL解析;让它更容易做到。例如,

from urllib import parse
import sys
path = parse.urlparse(sys.stdin.read().strip()).path
print("/" if not path or path == "/" else path.rsplit("/", 1)[-1])

您可以将其压缩为一个单一的文件python3 -c,以在shell脚本中使用:

echo 'https://example.com/this/is/a/path/componets?query#target' \
    | python3 -c 'from urllib import parse; import sys; path = parse.urlparse(sys.stdin.read().strip()).path; print("/" if not path or path == "/" else path.rsplit("/", 1)[-1])'

(出于可读性考虑,您也可以保留该脚本,以便'放入换行符。)

当然,现在您的Shell脚本依赖于Python。

(我不太确定if是否尝试处理URL的路径部分为根(/)的情况;请调整/测试对您而言是否重要。)


1

一种方法是对revURL进行剪切,然后rev再剪切该字段。例如:

echo 'http://www.test.com/abc/def/efg/file.jar ' | rev | cut -d '/' -f 1 | rev

输出:

file.jar 

范例2:

echo 'http://www.test.com/abc/cscsc/sccsc/def/efg/file.jar ' | rev | cut -d '/' -f 1 | rev

输出:

file.jar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.