Bagaimana cara mendapatkan bagian terakhir dari tautan http di Bash?

25

Saya punya tautan http:

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

dan saya ingin menyimpan file.jar bagian terakhir ke variabel, jadi string output adalah "file.jar".

Ketentuan : tautan dapat memiliki panjang yang berbeda, misalnya:

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

Saya mencobanya seperti itu:

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

, tapi masalahnya adalah panjang URL, jadi saya butuh perintah yang bisa digunakan untuk panjang URL apa pun.

FunTomas
sumber

Jawaban:

51

Menggunakan awkini akan berhasil, tapi itu semacam berburu rusa dengan howitzer. Jika URL Anda kosong, cukup mudah untuk melakukan apa yang Anda inginkan jika Anda memasukkannya ke dalam variabel shell dan menggunakan bashsubstitusi parameter bawaan:

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

Cara kerjanya adalah dengan menghapus awalan yang serasi dengan '* /', yang dilakukan oleh ##operator:

${haystack##needle} # removes any matching 'needle' from the
                    # beginning of the variable 'haystack'
DopeGhoti
sumber
Adakah penjelasan untuk itu?
Questionmark
Yakin. Akankah itu berhasil?
DopeGhoti
Itu luar biasa :)
Questionmark
2
Jika Anda ingin menghapus string kueri, pertama-tama Anda dapat menetapkan ke variabel antara mis file=${myurl##*/}, kemudian gunakan pencocokan terbalik serakah untuk mencadangkan ?(jangan lupa untuk menghindarinya!), Misalnyaecho ${file%%\?*}
Doktor J
21

basenamedan dirnameberfungsi baik untuk URL juga:

> 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
Fedor Dikarev
sumber
+1 Brilliant, ini berfungsi karena URL dan PATH dan keduanya URI.
Tulains Córdova
1
@ TulainsCórdova jalan bukanlah URI ; ini berfungsi karena basenamedan dirnamepisahkan string pada /, dan itu juga berfungsi dengan URL, setidaknya selama mereka tidak memiliki porsi lokal (tidak dengan URI pada umumnya).
Stephen Kitt
Dalam artikel Wikipedia tentang URI, mereka memberikan berikut sebagai contoh valid dari referensi URI: /relative/URI/with/absolute/path/to/resource.txt, relative/path/to/resource.txt, ../../../resource.txtdan resource.txt en.wikipedia.org/wiki/...
Tulains Córdova
1
@ TulainsCórdova Wikipedia tidak salah, /relative/pathbisa berupa jalur sistem file atau URI relatif. Tetapi yang mana dari itu tergantung pada konteksnya. Ketika digunakan sebagai jalur sistem file, itu bukan URI. Ketika digunakan sebagai URI, itu bukan jalur sistem file. Mengatakan itu adalah URI hanya karena kebetulan cocok dengan sintaksinya seperti mengatakan setiap kata dalam komentar ini adalah URI juga.
hvd
11

Dengan awk, Anda dapat menggunakan $NF, untuk mendapatkan bidang terakhir, berapapun jumlah bidangnya:

awk -F / '{print $NF}'

Jika Anda menyimpan string itu dalam variabel shell, Anda dapat menggunakan:

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

Sebagian besar jawaban yang diposting tidak kuat pada URL yang berisi string atau target kueri, seperti, misalnya, yang berikut:

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

Python memiliki parsing URL di pustaka standarnya; lebih mudah membiarkannya melakukannya. Misalnya,

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

Anda bisa memadatkannya menjadi satu python3 -cuntuk digunakan dalam skrip 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])'

(Anda juga dapat menjaga agar skrip tetap tidak dapat dibaca. 'Anda dapat memasukkan baris baru.)

Tentu saja, sekarang skrip shell Anda memiliki ketergantungan pada Python.

(Saya sedikit tidak yakin tentang jika yang mencoba menangani kasus-kasus di mana komponen jalur URL adalah root ( /); sesuaikan / uji jika itu penting bagi Anda.)

Thanatos
sumber
1

Salah satu metode adalah dengan revURL lalu potong bidang dan sekali revlagi. misalnya:

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

Keluaran:

file.jar 

Contoh 2:

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

Keluaran:

file.jar
Nived Thanima
sumber