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

10

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

No arquivo, o URL é assim:

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

Eu tentei usar o seguinte:

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

Ele fornece a saída como:

'http://url.com');

Mas eu preciso obter apenas url.com em uma variável dentro do script de shell. Como posso conseguir isso?

    
por Tarun 17.02.2014 / 15:54

7 respostas

10

Algo parecido com isto?

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

ou

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

Para remover http: //.

    
por Frantique 17.02.2014 / 15:58
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 \K , que, em regex Perl, significa discard everything matched to the left of the \K . Assim, a expressão regular procura por strings começando com http:// (que é então descartado por causa do \K ) seguido por tantos caracteres que não são ' . Combinado com -o , isso significa que somente a URL será impressa.

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

perl -ne "print if s/.*http:\/\/(.+)\'.*/$1/" file.php\
    
por terdon 17.02.2014 / 18:35
5

Tente isso,

awk -F// '{print }' file.php | cut -d "'" -f 1
    
por souravc 17.02.2014 / 16:02
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 'dirty' e file.out conterá a lista de URLs 'limpa'. Não há dependências externas e não há necessidade de gerar novos processos ou subpainhas. A explicação original e um roteiro mais flexível segue. Há um bom resumo do método aqui , veja o exemplo 10-10. Esta é a substituição de parâmetros baseada em padrões 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 programas externos. Além disso, o seguinte script bash, get_urls.sh , permite que você leia um arquivo diretamente ou de 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=""
  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
    
por AsymLabs 17.02.2014 / 23:30
3

Se todas as linhas contiverem um URL:

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

Se apenas algumas linhas contiverem um URL:

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

Dependendo das outras linhas, pode ser necessário alterar o ^define regex

    
por Florian Diesch 17.02.2014 / 16:12
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://\(.*\)!!'

Então:

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

Se você precisar de uma determinada parte da URL que precisa para refinar sua terminologia, uma URL é todas das seguintes, algumas vezes mais:

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

FQDN := [hostname.]domain.tld
    
por Sammitch 17.02.2014 / 22:19
0

para mim, o outro grep responde com informações de string de retorno após o link.

Isso funcionou para eu apenas extrair o url :

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

Tags