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


10

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

В файле URL выглядит так:

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

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

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

Это дает вывод как:

'http://url.com');

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

Ответы:


11

Что-то вроде этого?

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

или

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

Чтобы раздеть http: //.


3
Или: cat file.php | grep 'URL' | cut -d "'" -f 4.
Эрик Карвалью

Я попробовал ответ от Frantique, который он http://url.comне далurl.com
Тарун

1
@ Тарун. Да, я просто хотел сказать, что нет необходимости дважды переворачивать текст.
Эрик Карвалью

1
Если вы хотите сопоставить что-либо с помощью /sed, обычно следует использовать другой разделитель, например sed s@http://@@g.
Кевин

2
Однако это очень неэффективно, решение 1 вызывает 5 процессов по 4 каналам, а решение 2 вызывает 3 процесса по 2 каналам, включая 2 регулярных выражения. Все это можно сделать в оболочке Bash без каких-либо каналов, процессов или зависимостей.
AsymLabs

14

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

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

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

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

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

очень хороший ответ. +1 от меня.
souravc

Очень хорошее компактное решение. Мой любимый тоже.
AsymLabs

5

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

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

Нет не сработало.
Тарун

в чем проблема? echo "define('URL', 'http://url.com');" | awk -F// '{print $2}' | cut -d "'" -f 1
Можете

Проблема в том, что url.comк другому URL-адресу, как, например, abc.com, он динамический, и мне нужно получить этот URL-адрес с помощью сценария оболочки.
Тарун

4

Пересматривая это снова и пытаясь использовать ничего, кроме оболочки 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

Ницца +1. Строго говоря, хотя есть подоболочка, цикл while происходит в подоболочке. С другой стороны, это работает практически со всеми оболочками, за исключением того [t]csh, что это хорошо для sh, bash, dash, ksh, zsh ...
terdon

Баш за победу!
Андреа Корбеллини

3

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

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

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

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

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


Это сработало, просто нужно было добавить оператор cut, который я использовалawk -F"'|http://" '/^define/ {print $5}' file.php | cut -d ")" -f 1
Tarun

0

Просто:

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

для меня остальные grepответы дают строку информации после ссылки.

Это сработало для меня, чтобы вытащить только url:

egrep -o "(http(s)?://){1}[^'\"]+"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.