У меня есть файл, который состоит из URL-адреса. Я пытаюсь получить URL-адрес из этого файла с помощью сценария оболочки.
В файле URL-адрес выглядит следующим образом:
('URL', 'http://url.com');
Я попытался использовать следующее:
cat file.php | grep 'URL' | awk '{ print $2 }'
Он дает результат как:
'http://url.com');
Но мне нужно получить только url.com в переменной внутри скрипта оболочки. Как я могу это сделать?
Вы можете сделать все с помощью простого 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\
Попробуйте это,
awk -F// '{print $2}' file.php | cut -d "'" -f 1
Повторяя это снова и пытаясь использовать ничего, кроме оболочки 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
Если все строки содержат URL-адрес:
awk -F"'|http://" '{print $5}' file.php
Если только некоторые строки содержат URL-адрес:
awk -F"'|http://" '/^define/ {print $5}' file.php
В зависимости от других строк вам может потребоваться изменить ^define regex
Простой:
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
для меня, другой grep отвечает на данные возвращаемой строки после ссылки.
Это помогло мне только вытащить url:
egrep -o "(http(s)?://){1}[^'\"]+"