Jak uzyskać adres URL z pliku przy użyciu skryptu powłoki

10

Mam plik, który składa się z adresu URL . Próbuję uzyskać adres URL z tego pliku za pomocą skryptu powłoki.

W pliku adres URL wygląda następująco:

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

Próbowałem użyć następujących opcji:

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

Daje to wynik jako:

'http://url.com');

Ale muszę tylko wpisać url.comzmienną w skrypcie powłoki. Jak mogę to osiągnąć?

Tarun
źródło

Odpowiedzi:

11

Coś takiego?

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

lub

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

Aby usunąć http: //.

Frantique
źródło
3
Lub: cat file.php | grep 'URL' | cut -d "'" -f 4.
Eric Carvalho
Próbowałem odpowiedzieć przez Frantique, która http://url.comnie dałaurl.com
Tarun,
1
@ Tarun Tak, chciałem tylko powiedzieć, że nie ma potrzeby podwójnego odwracania tekstu.
Eric Carvalho
1
Jeśli chcesz coś dopasować /w sed, zwykle powinieneś użyć innego separatora, np sed s@http://@@g.
Kevin
2
Jest to jednak bardzo nieefektywne, rozwiązanie 1 wywołuje 5 procesów na 4 rurach, a rozwiązanie 2 wywołuje 3 procesy na 2 rurach, w tym 2 wyrażenia regularne. Wszystko to można zrobić w powłoce Bash bez żadnych potoków, procesów ani zależności.
AsymLabs
14

Możesz zrobić wszystko za pomocą prostego grep:

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

Od 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.

Sztuką jest użycie, \Kco w wyrażeniu regularnym Perla oznacza discard everything matched to the left of the \K. Wyrażenie regularne szuka ciągów zaczynających się od http://(które są następnie odrzucane z powodu \K), po których następuje jak najwięcej 'znaków nie będących znakami. W połączeniu z -ooznacza to, że wydrukowany zostanie tylko adres URL.

Możesz to również zrobić bezpośrednio w Perlu:

perl -ne "print if s/.*http:\/\/(.+)\'.*/\$1/" file.php\
terdon
źródło
bardzo ładna odpowiedź. +1 ode mnie
souravc
Bardzo ładne kompaktowe rozwiązanie. Mój ulubiony też.
AsymLabs
5

Spróbuj tego,

awk -F// '{print $2}' file.php | cut -d "'" -f 1
souravc
źródło
Nie, nie działało.
Tarun
Jaki jest problem? czy możesz mi powiedzieć, czy masz racjęecho "define('URL', 'http://url.com');" | awk -F// '{print $2}' | cut -d "'" -f 1
souravc
Problemem jest to, że url.comdo innego adresu URL, podobnie jak abc.com, jest dynamiczny i muszę pobrać ten adres URL za pomocą skryptu powłoki.
Tarun
4

Ponownie odwiedzając tę ​​stronę i próbując użyć niczego poza powłoką Bash, kolejnym rozwiązaniem jednego wiersza jest:

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

Gdzie plik.in zawiera „brudną” listę adresów URL, a plik.out zawiera „czystą” listę adresów URL. Nie ma zewnętrznych zależności i nie ma potrzeby tworzenia nowych procesów lub podpowłok. Poniżej znajduje się oryginalne wyjaśnienie i bardziej elastyczny skrypt. Jest to podsumowanie dobre metody tutaj , zobacz przykład 10-10. Jest to podstawianie parametrów oparte na wzorcach w Bash.

Rozwijanie pomysłu:

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

Wynik:

url.com

Nie trzeba wywoływać żadnych programów zewnętrznych. Ponadto następujący skrypt bash get_urls.shumożliwia odczyt pliku bezpośrednio lub ze standardowego wejścia:

#!/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
źródło
Fajnie, +1. Ściśle mówiąc, istnieje podpowłoka, pętla while zachodzi w podpowłoce. Z drugiej strony działa to z dowolną powłoką, z wyjątkiem [t]csh, więc jest dobre dla sh, bash, dash, ksh, zsh ...
terdon
Bash za zwycięstwo!
Andrea Corbellini
3

Jeśli wszystkie wiersze zawierają adres URL:

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

Jeśli tylko niektóre wiersze zawierają adres URL:

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

W zależności od innych linii może być konieczna zmiana ^definewyrażenia regularnego

Florian Diesch
źródło
Działa, po prostu musiałem dodać wyciętą instrukcję, której użyłemawk -F"'|http://" '/^define/ {print $5}' file.php | cut -d ")" -f 1
Tarun,
0

Prosty:

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

a jeśli musisz usunąć „http: //”, to:

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

Więc:

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

Jeśli potrzebujesz określonej części adresu URL, musisz dopracować terminologię, adres URL zawiera wszystkie poniższe elementy, czasem więcej:

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

FQDN := [hostname.]domain.tld
Sammitch
źródło
0

dla mnie pozostałe grepodpowiedzi otrzymały informację o ciągu zwrotnym po linku.

Pomogło mi to wyciągnąć tylko url:

egrep -o "(http(s)?://){1}[^'\"]+"
użytkownik509619
źródło