Como obter o URL de um arquivo usando um script de shell

10

Eu tenho um arquivo que consiste em uma URL . Estou tentando obter a URL desse arquivo usando um script de shell.

No arquivo, a URL é assim:

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

Eu tentei usar o seguinte:

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

Ele fornece a saída como:

'http://url.com');

Mas eu preciso obter apenas url.comuma variável dentro do script de shell. Como posso fazer isso?

Tarun
fonte

Respostas:

11

Algo assim?

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

ou

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

Para retirar http: //.

Frantique
fonte
3
Ou: cat file.php | grep 'URL' | cut -d "'" -f 4.
Eric Carvalho
Tentei a resposta por Frantique deu http://url.comnãourl.com
Tarun
1
@ Tarun Sim, eu só queria dizer que não há necessidade de reverter o texto duas vezes.
Eric Carvalho
1
Quando você deseja combinar algo com o /sed, você deve usar um delimitador diferente, por exemplo sed s@http://@@g.
Kevin
2
Isso é muito ineficiente, porém, a solução 1 chama 5 processos em 4 canais e a solução 2 chama 3 processos em 2 canais, incluindo 2 regexes. Tudo isso pode ser feito no shell Bash sem canais, processos ou dependências.
AsymLabs
14

Você pode fazer tudo com um simples 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.

O truque é usar o \Kque, no Perl regex, significa discard everything matched to the left of the \K. Portanto, a expressão regular procura por seqüências iniciadas por http://(que são descartadas por causa de \K) seguidas pelo maior número 'possível de caracteres não . Combinado com -o, isso significa que apenas o URL será impresso.

Você também pode fazer isso diretamente no Perl:

perl -ne "print if s/.*http:\/\/(.+)\'.*/\$1/" file.php\
Terdon
fonte
resposta muito boa. +1 de mim.
souravc 17/02
Solução compacta muito boa. O meu favorito também.
AsymLabs
5

Tente isso,

awk -F// '{print $2}' file.php | cut -d "'" -f 1
souravc
fonte
Não não funcionou.
Tarun
qual é o problema? você pode me dizer se está obtendo o corretoecho "define('URL', 'http://url.com');" | awk -F// '{print $2}' | cut -d "'" -f 1
souravc
O problema é que o url.comURL para um URL diferente, bem como o abc.com, é dinâmico e eu preciso pegar esse URL usando o shell script.
Tarun
4

Revisitando isso novamente e tentando usar nada além de um shell Bash, outra solução de uma linha é:

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

Onde file.in contém a lista de URLs 'sujos' e file.out conterá a lista de URLs 'limpos'. Não há dependências externas e não há necessidade de gerar novos processos ou subshells. A explicação original e um script mais flexível seguem. Há um bom resumo do método aqui , veja o exemplo 10-10. Isso é substituição de parâmetro baseada em padrão no Bash.

Expandindo a ideia:

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

Não há necessidade de chamar nenhum programa externo. Além disso, o seguinte script bash get_urls.sh, permite ler um arquivo diretamente ou a partir do 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
AsymLabs
fonte
Bom, +1. A rigor, porém, existe um subshell, o loop while acontece em um subshell. No lado do brilhante, isso funciona com praticamente qualquer shell, exceto [t]csh, por isso é bom para sh, bash, traço, ksh, zsh ...
terdon
Bash pela vitória!
Andrea Corbellini
3

Se todas as linhas contiverem um URL:

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

Se apenas algumas linhas contiverem um URL:

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

Dependendo das outras linhas, pode ser necessário alterar a ^defineregex

Florian Diesch
fonte
Funcionou só tinha que adicionar uma declaração de corte o comando que eu usei éawk -F"'|http://" '/^define/ {print $5}' file.php | cut -d ")" -f 1
Tarun
0

Simples:

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

e se você precisar remover o 'http: //', então:

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

Assim:

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

Se você precisa de um certo parte da URL que você precisa para refinar a sua terminologia, a URL é tudo do seguinte, às vezes mais:

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

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

para mim, as outras greprespostas fornecidas retornam informações da sequência após o link.

Isso funcionou para mim retirar apenas o url:

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