Come ottenere l'URL da un file usando uno script di shell


10

Ho un file che consiste in un URL . Sto cercando di ottenere l'URL da quel file usando uno script di shell.

Nel file, l'URL è così:

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

Ho provato a usare quanto segue:

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

Fornisce l'output come:

'http://url.com');

Ma ho bisogno di entrare solo url.comin una variabile all'interno dello script della shell. Come posso farlo?

Risposte:


11

Qualcosa come questo?

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

o

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

Per eliminare http: //.


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

Ho provato la risposta di Frantique che http://url.comnon ha datourl.com
Tarun,

1
@Tarun Sì, volevo solo dire che non è necessario raddoppiare il testo.
Eric Carvalho,

1
Quando vuoi abbinare qualcosa con /in sed, di solito dovresti usare un delimitatore diverso, ad es sed s@http://@@g.
Kevin,

2
Questo è molto inefficiente, tuttavia, la soluzione 1 chiama 5 processi su 4 pipe e la soluzione 2 chiama 3 processi su 2 pipe di cui 2 regex. Tutto ciò può essere fatto nella shell Bash senza pipe, processi o dipendenze.
AsymLab

14

Puoi fare tutto con un semplice grep:

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

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

Il trucco è usare ciò \Kche, in Perl regex, significa discard everything matched to the left of the \K. Quindi, l'espressione regolare cerca le stringhe che iniziano con http://(che viene quindi scartata a causa del \K) seguite dal maggior numero di non 'caratteri possibili. Combinato con -o, questo significa che verrà stampato solo l'URL.

Puoi anche farlo direttamente in Perl:

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

risposta molto bella. +1 da me.
souravc,

Soluzione compatta molto bella. Anche il mio preferito.
AsymLabs

5

Prova questo,

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

No non ha funzionato.
Tarun,

qual è il problema? puoi dirmi se lo stai ottenendo correttamenteecho "define('URL', 'http://url.com');" | awk -F// '{print $2}' | cut -d "'" -f 1
souravc,

Il problema è che l' url.comURL diverso come abc.com è dinamico e ho bisogno di afferrare questo url usando script di shell.
Tarun,

4

Rivisitandolo nuovamente e provando a usare nient'altro che una shell Bash, un'altra soluzione a una riga è:

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

Dove file.in contiene l'elenco URL "sporco" e file.out conterrà l'elenco URL "pulito". Non ci sono dipendenze esterne e non è necessario generare nuovi processi o subshells. Segue la spiegazione originale e uno script più flessibile. C'è un buon riassunto del metodo qui , vedi esempio 10-10. Questa è la sostituzione dei parametri basata su pattern in Bash.

Espandendo l'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 '

Risultato:

url.com

Non è necessario chiamare alcun programma esterno. Inoltre, il seguente script bash get_urls.sh, consente di leggere un file direttamente o da 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

Bello, +1. A rigor di termini, tuttavia, esiste una subshell, mentre il ciclo while avviene in una subshell. Il lato [t]cshpositivo è che funziona praticamente con qualsiasi shell tranne , quindi è buono per sh, bash, dash, ksh, zsh ...
terdon

Bash per la vittoria!
Andrea Corbellini,

3

Se tutte le righe contengono un URL:

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

Se solo alcune righe contengono un URL:

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

A seconda delle altre righe potrebbe essere necessario modificare la ^defineregex


Ha funzionato solo per aggiungere una dichiarazione di taglio il comando che ho usato èawk -F"'|http://" '/^define/ {print $5}' file.php | cut -d ")" -f 1
Tarun

0

Semplice:

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

e se devi rimuovere "http: //", allora:

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

Così:

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

Se hai bisogno di una determinata parte dell'URL che devi perfezionare la tua terminologia, un URL è tutto quanto segue, a volte di più:

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

FQDN := [hostname.]domain.tld

0

per me, le altre greprisposte fornite restituiscono informazioni sulla stringa dopo il collegamento.

Questo ha funzionato per me solo per estrarre il url:

egrep -o "(http(s)?://){1}[^'\"]+"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.