So erhalten Sie die URL mithilfe eines Shell-Skripts aus einer Datei

10

Ich habe eine Datei, die aus einer URL besteht . Ich versuche, die URL aus dieser Datei mithilfe eines Shell-Skripts abzurufen.

In der Datei lautet die URL wie folgt:

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

Ich habe versucht, Folgendes zu verwenden:

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

Es gibt die Ausgabe als:

'http://url.com');

Aber ich muss nur url.comin eine Variable innerhalb des Shell-Skripts gelangen. Wie kann ich das erreichen?

Tarun
quelle

Antworten:

11

Etwas wie das?

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

oder

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

So entfernen Sie http: //.

Frantique
quelle
3
Oder : cat file.php | grep 'URL' | cut -d "'" -f 4.
Eric Carvalho
Ich versuchte die Antwort von Frantique, die es http://url.comnicht gaburl.com
Tarun
1
@ Tarun Ja, ich wollte nur sagen, dass es nicht nötig ist, den Text doppelt umzukehren.
Eric Carvalho
1
Wenn Sie etwas mit /in sed abgleichen möchten , sollten Sie normalerweise ein anderes Trennzeichen verwenden, z sed s@http://@@g.
Kevin
2
Dies ist jedoch sehr ineffizient. Lösung 1 ruft 5 Prozesse über 4 Pipes auf, und Lösung 2 ruft 3 Prozesse über 2 Pipes auf, einschließlich 2 regulären Ausdrücken. Dies kann alles in der Bash-Shell ohne Pipes, Prozesse oder Abhängigkeiten erfolgen.
AsymLabs
14

Sie können alles mit einem einfachen machen grep:

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

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

Der Trick besteht darin, zu verwenden, \Kwas in Perl-Regex bedeutet discard everything matched to the left of the \K. Der reguläre Ausdruck sucht also nach Zeichenfolgen, die mit beginnen http://(was dann aufgrund von verworfen wird \K), gefolgt von so vielen Nicht- 'Zeichen wie möglich. In Kombination mit -obedeutet dies, dass nur die URL gedruckt wird.

Sie können dies auch direkt in Perl tun:

perl -ne "print if s/.*http:\/\/(.+)\'.*/\$1/" file.php\
Terdon
quelle
sehr schöne Antwort. +1 von mir.
Souravc
Sehr schöne kompakte Lösung. Mein Favorit auch.
AsymLabs
5

Versuche dies,

awk -F// '{print $2}' file.php | cut -d "'" -f 1
Souravc
quelle
Nein hat nicht funktioniert.
Tarun
worin besteht das Problem? können Sie mir sagen , wenn Sie es richtig bekommenecho "define('URL', 'http://url.com');" | awk -F// '{print $2}' | cut -d "'" -f 1
souravc
Das Problem ist, dass die url.comzu einer anderen URL sowie abc.com seine Dynamik hat und ich diese URL mit einem Shell-Skript abrufen muss.
Tarun
4

Wenn Sie dies noch einmal wiederholen und versuchen, nur eine Bash-Shell zu verwenden, ist eine andere einzeilige Lösung:

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

Wobei file.in die 'schmutzige' URL-Liste enthält und file.out die 'saubere' URL-Liste enthält. Es gibt keine externen Abhängigkeiten und es müssen keine neuen Prozesse oder Subshells erzeugt werden. Die ursprüngliche Erklärung und ein flexibleres Skript folgen. Es gibt eine gute Zusammenfassung des Verfahrens hier , siehe Beispiel 10-10. Dies ist eine musterbasierte Parametersubstitution in Bash.

Erweiterung der Idee:

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

Ergebnis:

url.com

Es müssen keine externen Programme aufgerufen werden. Darüber hinaus können Sie mit dem folgenden Bash-Skript get_urls.sheine Datei direkt oder von stdin aus lesen:

#!/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
quelle
Schön, +1. Genau genommen gibt es jedoch eine Unterschale, die while-Schleife findet in einer Unterschale statt. Auf der positiven Seite funktioniert dies mit fast jeder Shell außer [t]csh, also ist es gut für sh, bash, dash, ksh, zsh ...
terdon
Bash für den Sieg!
Andrea Corbellini
3

Wenn alle Zeilen eine URL enthalten:

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

Wenn nur einige Zeilen eine URL enthalten:

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

Abhängig von den anderen Zeilen müssen Sie möglicherweise den ^defineregulären Ausdruck ändern

Florian Diesch
quelle
Es hat funktioniert, ich musste nur eine Cut-Anweisung hinzufügen. Der Befehl, den ich verwendet habe, istawk -F"'|http://" '/^define/ {print $5}' file.php | cut -d ")" -f 1
Tarun
0

Einfach:

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

und wenn Sie das 'http: //' entfernen müssen, dann:

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

So:

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

Wenn Sie einen bestimmten müssen Teil der URL müssen Sie Ihre Terminologie verfeinern, ist eine URL alle der folgenden, manchmal mehr:

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

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

Für mich geben die anderen grepAntworten Informationen zur Zeichenfolge nach dem Link zurück.

Dies funktionierte für mich, um nur das herauszuziehen url:

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