Cómo obtener la URL de un archivo usando un script de shell


10

Tengo un archivo que consta de una URL . Estoy tratando de obtener la URL de ese archivo usando un script de shell.

En el archivo, la URL es así:

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

Traté de usar lo siguiente:

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

Da la salida como:

'http://url.com');

Pero solo necesito obtener url.comuna variable dentro del script de shell. ¿Cómo puedo lograr esto?

Respuestas:


11

¿Algo como esto?

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

o

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

Para eliminar http: //.


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

Probé la respuesta de Frantique que http://url.comno diourl.com
Tarun

1
@Tarun Sí, solo quería decir que no hay necesidad de revertir el texto dos veces.
Eric Carvalho

1
Cuando desee hacer coincidir algo con /in sed, generalmente debería usar un delimitador diferente, por ejemplo sed s@http://@@g.
Kevin

2
Sin embargo, esto es muy ineficiente, la solución 1 llama a 5 procesos en 4 tuberías y la solución 2 llama a 3 procesos en 2 tuberías, incluidas 2 expresiones regulares. Todo esto se puede hacer en el shell Bash sin tuberías, procesos o dependencias.
AsymLabs

14

Puedes hacer todo con 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.

El truco es usar lo \Kque, en Perl regex, significa discard everything matched to the left of the \K. Por lo tanto, la expresión regular busca cadenas que comienzan con http://(que luego se descartan debido a \K) seguidas de la mayor cantidad 'posible de no caracteres. En combinación con -oesto, esto significa que solo se imprimirá la URL.

También puedes hacerlo en Perl directamente:

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

Muy buena respuesta. +1 de mi parte
souravc

Muy buena solución compacta. Mi favorito también
AsymLabs

5

Prueba esto,

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

No no funcionó.
Tarun

¿Cuál es el problema? ¿Puedes decirme si lo estás haciendo bienecho "define('URL', 'http://url.com');" | awk -F// '{print $2}' | cut -d "'" -f 1
Souravc

El problema es que el url.coma una url diferente, así como abc.com, es dinámico y necesito tomar esta url usando el script de shell.
Tarun

4

Revisando esto nuevamente, y tratando de usar nada más que un shell Bash, otra solución de una línea es:

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

Donde file.in contiene la lista de URL 'sucia' y file.out contendrá la lista de URL 'limpia'. No hay dependencias externas y no hay necesidad de generar nuevos procesos o subcapas. La explicación original y un guión más flexible siguen. Hay una buena Resumen del método aquí , véase el ejemplo 10-10. Esta es la sustitución de parámetros basada en patrones en Bash.

Ampliando la idea:

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

Resultado:

url.com

No es necesario llamar a ningún programa externo. Además, el siguiente script bash get_urls.sh, le permite leer un archivo directamente o desde 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

Niza, +1. Estrictamente hablando, sin embargo, hay una subshell, el ciclo while ocurre en una subshell. En el lado positivo, esto funciona con casi cualquier caparazón excepto [t]csh, por lo que es bueno para sh, bash, dash, ksh, zsh ...
terdon

Bash por la victoria!
Andrea Corbellini

3

Si todas las líneas contienen una URL:

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

Si solo algunas líneas contienen una URL:

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

Dependiendo de las otras líneas, puede que necesite cambiar la ^defineexpresión regular


Funcionó solo tenía que agregar una declaración de corte, el comando que utilicé esawk -F"'|http://" '/^define/ {print $5}' file.php | cut -d ")" -f 1
Tarun

0

Simple:

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

y si necesita eliminar el 'http: //', entonces:

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

Entonces:

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

Si necesita cierta parte de la URL, necesita refinar su terminología, una URL es todo lo siguiente, a veces más:

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

FQDN := [hostname.]domain.tld

0

para mí, las otras greprespuestas dan información de cadena de retorno después del enlace.

Esto funcionó para mí solo para sacar el url:

egrep -o "(http(s)?://){1}[^'\"]+"
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.