Comment obtenir l'URL d'un fichier à l'aide d'un script shell


10

J'ai un fichier composé d'une URL . J'essaye d'obtenir l'URL de ce fichier en utilisant un script shell.

Dans le fichier, l'URL est comme ceci:

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

J'ai essayé d'utiliser ce qui suit:

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

Il donne la sortie comme:

'http://url.com');

Mais je dois obtenir seulement url.comdans une variable à l'intérieur du script shell. Comment puis-je accomplir cela?

Réponses:


11

Quelque chose comme ça?

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

ou

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

Pour supprimer http: //.


3
Ou: cat file.php | grep 'URL' | cut -d "'" -f 4.
Eric Carvalho

J'ai essayé la réponse par Frantique il a http://url.compasurl.com
Tarun

1
@Tarun Oui, je voulais juste dire qu'il n'est pas nécessaire de doubler le texte.
Eric Carvalho

1
Lorsque vous souhaitez faire correspondre quelque chose avec /in sed, vous devez généralement utiliser un délimiteur différent, par exemple sed s@http://@@g.
Kevin

2
Ceci est très inefficace, cependant, la solution 1 appelle 5 processus sur 4 canaux et la solution 2 appelle 3 processus sur 2 canaux, y compris 2 expressions régulières. Tout cela peut être fait dans le shell Bash sans aucun canal, processus ou dépendances.
AsymLabs

14

Vous pouvez tout faire avec un simple grep:

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

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

L'astuce consiste à utiliser \Kce qui, en expression rationnelle Perl, signifie discard everything matched to the left of the \K. Ainsi, l'expression régulière recherche les chaînes commençant par http://(qui sont ensuite supprimées à cause de \K) suivies par autant de non- 'caractères que possible. Combiné avec -o, cela signifie que seule l'URL sera imprimée.

Vous pouvez également le faire directement en Perl:

perl -ne "print if s/.*http:\/\/(.+)\'.*/\$1/" file.php\

très belle réponse. +1 de moi.
souravc

Très belle solution compacte. Mon préféré aussi.
AsymLabs

5

Essaye ça,

awk -F// '{print $2}' file.php | cut -d "'" -f 1

Non n'a pas fonctionné.
Tarun

quel est le problème? pouvez-vous me dire si vous l'obtenez correctementecho "define('URL', 'http://url.com');" | awk -F// '{print $2}' | cut -d "'" -f 1
souravc

Le problème est que url.comvers une URL différente, comme abc.com, sa dynamique et j'ai besoin de saisir cette URL en utilisant un script shell.
Tarun

4

Revisitant cela à nouveau et essayant de n'utiliser rien d'autre qu'un shell Bash, une autre solution d'une ligne est la suivante:

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

Où file.in contient la liste d'url «sale» et file.out contiendra la liste d'URL «propre». Il n'y a pas de dépendances externes et il n'est pas nécessaire de générer de nouveaux processus ou sous-coquilles. L'explication originale et un script plus flexible suivent. Il y a un bon résumé de la méthode ici , voir l'exemple 10-10. Il s'agit d'une substitution de paramètres basée sur un modèle dans Bash.

Développer l'idée:

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

Résultat:

url.com

Pas besoin d'appeler de programmes externes. De plus, le script bash suivant get_urls.sh, vous permet de lire un fichier directement ou depuis 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

Nice, +1. À strictement parler cependant, il existe un sous-shell, la boucle while se produit dans un sous-shell. Du côté [t]cshpositif , cela fonctionne avec à peu près n'importe quel shell sauf , donc c'est bon pour sh, bash, dash, ksh, zsh ...
terdon

Bash pour la victoire!
Andrea Corbellini

3

Si toutes les lignes contiennent une URL:

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

Si seulement certaines lignes contiennent une URL:

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

Selon les autres lignes, vous devrez peut-être modifier l' ^defineexpression régulière


Cela a fonctionné juste pour ajouter une déclaration de coupure que la commande que j'ai utilisée estawk -F"'|http://" '/^define/ {print $5}' file.php | cut -d ")" -f 1
Tarun

0

Facile:

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

et si vous devez supprimer le 'http: //', alors:

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

Donc:

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

Si vous avez besoin d'une certaine partie de l'URL dont vous avez besoin pour affiner votre terminologie, une URL est tout ce qui suit, parfois plus:

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

FQDN := [hostname.]domain.tld

0

pour moi, les autres grepréponses données retournent des informations de chaîne après le lien.

Cela a fonctionné pour moi de ne retirer que url:

egrep -o "(http(s)?://){1}[^'\"]+"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.