URL'yi kabuk betiği kullanarak bir dosyadan alma


10

URL'den oluşan bir dosyam var . Ben bir kabuk komut dosyası kullanarak bu dosyadan URL almaya çalışıyorum.

Dosyada URL şöyle:

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

Aşağıdakileri kullanmaya çalıştım:

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

Çıkışı şu şekilde verir:

'http://url.com');

Ama sadece url.comkabuk betiğinin içindeki bir değişkeni almam gerekiyor . Bunu nasıl başarabilirim?

Yanıtlar:


11

Böyle bir şey mi?

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

veya

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

Http: // 'yi çıkarmak için.


3
Veya: cat file.php | grep 'URL' | cut -d "'" -f 4.
Eric Carvalho

Bunun verdi Frantique tarafından cevap çalıştı http://url.comdeğilurl.com
Tarun

1
@Tarun Evet, sadece metni iki kez ters çevirmeye gerek olmadığını söylemek istedim.
Eric Carvalho

1
/Sed ile bir şey eşleştirmek istediğinizde , genellikle farklı bir sınırlayıcı kullanmalısınız sed s@http://@@g.
Kevin

2
Bununla birlikte, bu çok verimsizdir, çözüm 1, 4 boru üzerinde 5 işlemi çağırır ve çözüm 2, 2 regex dahil 2 boru üzerinde 3 işlemi çağırır. Tüm bunlar Bash kabuğunda herhangi bir boru, işlem veya bağımlılık olmadan yapılabilir.
AsymLabs

14

Her şeyi basit bir şekilde yapabilirsiniz grep:

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

Gönderen 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.

İşin püf noktası \KPerl regex'in anlamını kullanmaktır discard everything matched to the left of the \K. Bu nedenle, normal ifade ile başlayan http://(sonra atılır \K) ve ardından 'mümkün olduğunca çok sayıda karakter olmayan dizeler arar . İle birlikte -osadece URL basılacaktır bu araçlar,.

Ayrıca doğrudan Perl'de de yapabilirsiniz:

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

çok güzel bir cevap. Benden +1.
souravc

Çok güzel kompakt çözüm. Benim de favorim.
AsymLabs

5

Bunu dene,

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

Hayır işe yaramadı.
Tarun

sorun nedir? doğru echo "define('URL', 'http://url.com');" | awk -F// '{print $2}' | cut -d "'" -f 1
alıp almadığınızı

Sorun şu ki url.comfarklı bir url yanı sıra abc.com dinamik gibi ve ben kabuk komut dosyası kullanarak bu url kapmak gerekir.
Tarun

4

Bunu tekrar gözden geçirmek ve Bash kabuğundan başka bir şey kullanmaya çalışmak, başka bir tek çözüm:

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

Burada file.in 'kirli' url listesini ve file.out 'temiz' URL listesini içerecektir. Dış bağımlılıklar yoktur ve yeni süreçler veya alt kabuklar üretmeye gerek yoktur. Orijinal açıklama ve daha esnek bir komut dosyası gelir. Yöntemin iyi özeti Orada burada , örnek 10-10 görüyoruz. Bu, Bash'deki örüntü tabanlı parametre ikamesidir.

Fikir üzerine genişleyen:

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

Sonuç:

url.com

Harici programları çağırmanıza gerek yok. Ayrıca, aşağıdaki bash betiği, get_urls.shbir dosyayı doğrudan veya stdin'den okumanıza izin verir:

#!/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

Güzel, +1. Kesinlikle konuşmak gerekirse, bir alt kabuk var, while döngüsü bir alt kabukta gerçekleşir. Parlak tarafta, bu sadece hariç herhangi bir kabuk ile çalışır, bu [t]cshyüzden sh, bash, dash, ksh, zsh için
iyidir

Kazanmak için bas!
Andrea Corbellini

3

Tüm satırlarda bir URL varsa:

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

Yalnızca bazı satırlarda URL varsa:

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

Diğer çizgilere bağlı olarak ^definenormal ifadeyi değiştirmeniz gerekebilir.


Kullandığım komutun bir kesim ifadesi eklemek zorunda kaldıawk -F"'|http://" '/^define/ {print $5}' file.php | cut -d ")" -f 1
Tarun

0

Basit:

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

ve "http: //" yi kaldırmanız gerekiyorsa:

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

Yani:

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

URL'nizin belirli bir kısmına ihtiyacınız varsa terminolojinizi hassaslaştırmanız gerekiyorsa, URL aşağıdakilerin tümü , bazen daha fazlasıdır:

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

FQDN := [hostname.]domain.tld

0

benim için, diğer grepcevaplar verilen bağlantıdan sonra dize bilgileri verdi.

Bu benim için url:

egrep -o "(http(s)?://){1}[^'\"]+"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.