Как получить URL-адрес из файла с помощью сценария оболочки

У меня есть файл, который состоит из URL-адреса. Я пытаюсь получить URL-адрес из этого файла с помощью сценария оболочки.

В файле URL-адрес выглядит следующим образом:

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

Я попытался использовать следующее:

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

Он дает результат как:

'http://url.com');

Но мне нужно получить только url.com в переменной внутри скрипта оболочки. Как я могу это сделать?

1
задан 1 March 2014 в 00:16

6 ответов

Вы можете сделать все с помощью простого grep:

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

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

Фокус в том, чтобы использовать \K, который в Perl regex, означает discard everything matched to the left of the \K. Таким образом, регулярное выражение ищет строки, начинающиеся с http:// (которые затем отбрасываются из-за \K), за которыми следует как можно больше не ' символов. В сочетании с -o это означает, что будет напечатан только URL-адрес.

Вы также можете сделать это прямо в Perl:

perl -ne "print if s/.*http:\/\/(.+)\'.*/\$1/" file.php\
14
ответ дан 24 May 2018 в 11:41

Попробуйте это,

awk -F// '{print $2}' file.php | cut -d "'" -f 1
5
ответ дан 24 May 2018 в 11:41
  • 1
    Нет, не сработало. – Tarun 17 February 2014 в 21:05
  • 2
    в чем проблема? можете ли вы сказать мне, правильно ли вы это сделаете echo "define('URL', 'http://url.com');" | awk -F// '{print $2}' | cut -d "'" -f 1 – souravc 17 February 2014 в 21:08
  • 3
    Проблема в том, что url.com на другой URL-адрес, а также abc.com его динамический, и мне нужно захватить этот URL-адрес, используя сценарий оболочки. – Tarun 17 February 2014 в 21:18

Повторяя это снова и пытаясь использовать ничего, кроме оболочки Bash, другое однострочное решение:

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

Где file.in содержит «грязный» список url ​​и file.out будет содержать «чистый» список URL-адресов. Внешних зависимостей нет, и нет необходимости создавать новые процессы или подоболочки. Далее следует оригинальное объяснение и более гибкий сценарий. Ниже приведено хорошее описание метода, см. Пример 10-10. Это переменная подстановки на основе шаблонов в Bash.

Расширение идеи:

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

Результат:

url.com

Не нужно вызывать какие-либо внешние программы , Кроме того, следующий сценарий bash, get_urls.sh, позволяет вам читать файл напрямую или из 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
4
ответ дан 24 May 2018 в 11:41
  • 1
    Ницца, +1. Строго говоря, хотя есть подоболочка, цикл while происходит в подоболочке. С яркой стороны это работает практически с любой оболочкой, кроме [t]csh, поэтому это хорошо для sh, bash, dash, ksh, zsh ... – terdon♦ 25 February 2014 в 15:39
  • 2
    Бэш для победы! – Andrea Corbellini 1 March 2014 в 00:17

Если все строки содержат URL-адрес:

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

Если только некоторые строки содержат URL-адрес:

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

В зависимости от других строк вам может потребоваться изменить ^define regex

3
ответ дан 24 May 2018 в 11:41
  • 1
    Это работало, просто нужно было добавить вырезанную команду, которую я использовал awk -F"'|http://" '/^define/ {print $5}' file.php | cut -d ")" -f 1 – Tarun 17 February 2014 в 21:17

Простой:

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

, и если вам нужно удалить «http: //», тогда:

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

Итак:

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

Если вам нужна определенная часть URL-адреса, вам нужно уточнить свою терминологию, URL-адрес будет следующим: иногда,

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

FQDN := [hostname.]domain.tld
0
ответ дан 24 May 2018 в 11:41

для меня, другой grep отвечает на данные возвращаемой строки после ссылки.

Это помогло мне только вытащить url:

egrep -o "(http(s)?://){1}[^'\"]+"
0
ответ дан 24 May 2018 в 11:41

Другие вопросы по тегам:

Похожие вопросы: