Cara mendapatkan URL dari file menggunakan skrip shell

10

Saya punya file yang terdiri dari URL . Saya mencoba mendapatkan URL dari file itu menggunakan skrip shell.

Dalam file tersebut, URL-nya adalah seperti ini:

('URL', 'http://url.com');

Saya mencoba menggunakan yang berikut ini:

cat file.php | grep 'URL' | awk '{ print $2 }'

Ini memberikan output sebagai:

'http://url.com');

Tapi saya hanya perlu mendapatkan url.comvariabel di dalam skrip shell. Bagaimana saya bisa mencapai ini?

Tarun
sumber

Jawaban:

11

Sesuatu seperti ini?

grep 'URL' file.php | rev | cut -d "'" -f 2 | rev

atau

grep 'URL' file.php | cut -d "'" -f 4 | sed s/'http:\/\/'/''/g

Untuk menghapus http: //.

Frantique
sumber
3
Atau: cat file.php | grep 'URL' | cut -d "'" -f 4.
Eric Carvalho
Aku mencoba jawaban dengan FRANTIQUE itu memberi http://url.combukanurl.com
Tarun
1
@ Talun Ya, saya hanya ingin mengatakan bahwa tidak perlu menggandakan teks.
Eric Carvalho
1
Ketika Anda ingin mencocokkan sesuatu dengan /sed, Anda biasanya harus menggunakan pembatas yang berbeda, misalnya sed s@http://@@g.
Kevin
2
Ini sangat tidak efisien, meskipun, solusi 1 memanggil 5 proses lebih dari 4 pipa, dan solusi 2 memanggil 3 proses lebih dari 2 pipa termasuk 2 regex. Ini semua bisa dilakukan dalam shell Bash tanpa pipa, proses atau dependensi.
AsymLabs
14

Anda dapat melakukan semuanya dengan sederhana grep:

grep -oP "http://\K[^']+" file.php 

Dari man grep:

   -P, --perl-regexp
          Interpret  PATTERN  as  a  Perl  regular  expression  (PCRE, see
          below).  This is highly experimental and grep  -P  may  warn  of
          unimplemented features.
   -o, --only-matching
          Print  only  the  matched  (non-empty) parts of a matching line,
          with each such part on a separate output line.

Triknya adalah menggunakan \Kyang, dalam Perl regex, artinya discard everything matched to the left of the \K. Jadi, ekspresi reguler mencari string yang dimulai dengan http://(yang kemudian dibuang karena \K) diikuti oleh sebanyak mungkin non- 'karakter. Dikombinasikan dengan -o, ini berarti hanya URL yang akan dicetak.

Anda juga bisa melakukannya di Perl secara langsung:

perl -ne "print if s/.*http:\/\/(.+)\'.*/\$1/" file.php\
terdon
sumber
jawaban yang sangat bagus +1 dari saya.
souravc
Solusi kompak yang sangat bagus. Favorit saya juga.
AsymLabs
5

Coba ini,

awk -F// '{print $2}' file.php | cut -d "'" -f 1
souravc
sumber
Tidak, tidak berhasil.
Tarun
Apa masalahnya? dapatkah Anda memberi tahu saya jika Anda melakukannya dengan benarecho "define('URL', 'http://url.com');" | awk -F// '{print $2}' | cut -d "'" -f 1
souravc
Masalahnya adalah bahwa url.comuntuk url yang berbeda juga seperti abc.com dinamis dan saya perlu mengambil url ini menggunakan skrip shell.
Tarun
4

Meninjau kembali ini, dan mencoba untuk tidak menggunakan apa pun selain Bash shell, solusi satu baris lainnya adalah:

while read url; do url="${url##*/}" && echo "${url%%\'*}"; done < file.in > file.out

Di mana file.in berisi daftar url 'kotor' dan file.out akan berisi daftar URL 'bersih'. Tidak ada dependensi eksternal dan tidak perlu menelurkan proses atau subkulit baru. Penjelasan asli dan skrip yang lebih fleksibel berikut. Ada ringkasan yang bagus dari metode ini di sini , lihat contoh 10-10. Ini adalah substitusi parameter berdasarkan pola di Bash.

Memperluas gagasan:

src="define('URL', 'http://url.com');"
src="${src##*/}"        # remove the longest string before and including /
echo "${src%%\'*}"      # remove the longest string after and including '

Hasil:

url.com

Tidak perlu memanggil program eksternal apa pun. Selanjutnya, skrip bash berikut get_urls.sh,, memungkinkan Anda untuk membaca file secara langsung atau dari stdin:

#!/usr/bin/env bash

# usage: 
#     ./get_urls.sh 'file.in'
#     grep 'URL' 'file.in' | ./get_urls.sh

# assumptions: 
#     there is not more than one url per line of text.
#     the url of interest is a simple one.

# begin get_urls.sh

# get_url 'string'
function get_url(){
  local src="$1"
  src="${src##*/}"        # remove the longest string before and including /
  echo "${src%%\'*}"      # remove the longest string after and including '
}

# read each line.
while read line
do
  echo "$(get_url "$line")"
done < "${1:-/proc/${$}/fd/0}"

# end get_urls.sh
AsymLabs
sumber
Bagus, +1. Sebenarnya, ada subkulit, loop sementara terjadi dalam subkulit. Sisi baiknya, ini bekerja dengan hampir semua shell kecuali [t]csh, jadi itu bagus untuk sh, bash, dash, ksh, zsh ...
terdon
Bash untuk menang!
Andrea Corbellini
3

Jika semua baris berisi URL:

awk -F"'|http://" '{print $5}' file.php 

Jika hanya beberapa baris yang berisi URL:

awk -F"'|http://" '/^define/ {print $5}' file.php 

Tergantung pada baris lain Anda mungkin perlu mengubah ^defineregex

Florian Diesch
sumber
Itu berhasil hanya harus menambahkan pernyataan memotong perintah yang saya gunakan adalahawk -F"'|http://" '/^define/ {print $5}' file.php | cut -d ")" -f 1
Tarun
0

Sederhana:

php -r 'include("file.php"); echo URL;'

dan jika Anda perlu menghapus 'http: //', maka:

php -r 'include("file.php"); echo URL;' | sed 's!^http://\(.*\)!\1!'

Begitu:

myURL=$(php -r 'include("file.php"); echo URL;' | sed 's!^http://\(.*\)!\1!')

Jika Anda memerlukan bagian tertentu dari URL yang Anda perlukan untuk mempersempit terminologi Anda, URL adalah semua yang berikut, terkadang lebih:

URL := protocol://FQDN[/path][?arguments]

FQDN := [hostname.]domain.tld
Sammitch
sumber
0

bagi saya, grepjawaban lain diberikan informasi string kembali setelah tautan.

Ini berhasil bagi saya untuk hanya mengeluarkan url:

egrep -o "(http(s)?://){1}[^'\"]+"
pengguna509619
sumber