У меня есть файл, который состоит из URL . Я пытаюсь получить URL из этого файла с помощью сценария оболочки.
В файле URL-адрес выглядит следующим образом:
('URL', 'http://url.com');
Я пытался использовать следующее:
cat file.php | grep 'URL' | awk '{ print $2 }'
Это дает вывод как:
'http://url.com');
Но мне нужно получить только url.com
в переменной внутри сценария оболочки. Как мне это сделать?
Еще раз повторяя это и пытаясь использовать только оболочку 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
[t]csh
, таким образом, it' s хороший для sh, удара, тире, ksh, zsh...
– Grant
14.05.2020, 07:53
Вы можете сделать все с помощью простых 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\
для меня, другие grep
ответы дали информацию о возвращаемой строке после ссылки.
Это сработало для меня, чтобы вытащить только url
:
egrep -o "(http(s)?://){1}[^'\"]+"
Если все строки содержат URL:
awk -F"'|http://" '{print $5}' file.php
Если только некоторые строки содержат URL:
awk -F"'|http://" '/^define/ {print $5}' file.php
В зависимости от других строк вам может потребоваться изменить ^define
регулярное выражение
awk -F"'|http://" '/^define/ {print $5}' file.php | cut -d ")" -f 1
– Black
14.05.2020, 07:54
Просто:
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
Попробуйте это,
awk -F// '{print $2}' file.php | cut -d "'" -f 1
url.com
к различному URL также как abc.com его динамическое и я должны захватить этот URL с помощью сценария оболочки.
– Martijn Pieters
14.05.2020, 07:56
echo "define('URL', 'http://url.com');" | awk -F// '{print $2}' | cut -d "'" -f 1
– Dmitriy.Net
14.05.2020, 07:57
/
в sed, необходимо обычно использовать различный разделитель, например,sed s@http://@@g
. – Codebeat 14.05.2020, 07:55http://url.com
неurl.com
– Sascha Galley 14.05.2020, 07:56cat file.php | grep 'URL' | cut -d "'" -f 4
. – Codebeat 14.05.2020, 07:57