Como obter a última parte do link http no Bash?

17

Eu tenho um link http:

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

e eu quero salvar a última parte file.jar para variável, então a string de saída é "file.jar".

Condição : o link pode ter comprimento diferente, por exemplo:

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

Eu tentei assim:

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

, mas o problema é o tamanho do URL, por isso preciso de um comando que possa ser usado para qualquer tamanho de URL.

    
por FunTomas 23.11.2016 / 16:56

5 respostas

39

Usar awk para isso funcionaria, mas é uma espécie de caça ao veado com um obuseiro. Se você já tem sua URL nua, é bem simples fazer o que você quer se você a colocar em uma variável shell e usar a substituição de parâmetro interna de bash :

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

A maneira como isso funciona é removendo um prefixo que combina avidamente '* /', que é o que o operador ## faz:

${haystack##needle} # removes any matching 'needle' from the
                    # beginning of the variable 'haystack'
    
por 23.11.2016 / 16:59
19

basename e dirname funcionam bem também para URLs:

> 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
    
por 23.11.2016 / 17:23
8

Com awk , você pode usar $NF para obter o último campo, independentemente do número de campos:

awk -F / '{print $NF}'

Se você armazenar essa string na variável shell, poderá usar:

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

A maioria das respostas postadas não é robusta em URLs que contêm strings ou destinos de consulta, como, por exemplo, o seguinte:

link

O Python tem análise de URL em sua biblioteca padrão; é mais fácil deixar isso acontecer. Por exemplo,

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])

Você pode compactar isso em um único python3 -c para usar em um script de 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])'

(Você também pode manter o script quebrado, também, para facilitar a leitura. ' permitirá que você coloque novas linhas.)

Claro, agora seu script de shell depende do Python.

(Estou um pouco inseguro sobre o if que tenta lidar com casos em que o componente do caminho da URL é a raiz ( / ); ajuste / teste se isso é importante para você.)

    
por 23.11.2016 / 21:08
1

Um método é rev do URL, em seguida, recorta o campo e, em seguida, rev novamente. por exemplo:

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

Saída:

file.jar 

Exemplo 2:

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

Saída:

file.jar
    
por 30.11.2016 / 06:28