Як отримати 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.
Ерік Карвальо

Я спробував відповідь Франтики, яку вона http://url.comне далаurl.com
Тарун

1
@Tarun Так, я просто хотів сказати, що не потрібно подвоювати текст вдвічі.
Ерік Карвальо

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. Власне кажучи, є нижня оболонка, в той час як цикл відбувається в нижній частині. З іншого боку, це працює практично з будь-якою оболонкою, окрім цього [t]csh, тому це добре для ш, баш, тире,
кш, зш

Баш на виграш!
Андреа Корбелліні

3

Якщо всі рядки містять 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
Тарун

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.