शेल स्क्रिप्ट का उपयोग करके फ़ाइल से URL कैसे प्राप्त करें


10

मेरे पास एक फाइल है जिसमें एक यूआरएल है । मैं एक शेल स्क्रिप्ट का उपयोग करके उस फ़ाइल से 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
@ तरुण हां, मैं सिर्फ यह कहना चाहता था कि पाठ को उल्टा करने की कोई आवश्यकता नहीं है।
एरिक कारवाल्हो

1
जब आप /सेड में किसी चीज के साथ मेल खाना चाहते हैं , तो आपको आमतौर पर एक अलग सीमांकक का उपयोग करना चाहिए, जैसे sed s@http://@@g
केविन

2
यह बहुत ही अयोग्य है, हालांकि, समाधान 1 4 पाइपों पर 5 प्रक्रियाओं को कॉल करता है, और समाधान 2 कॉल 2 पुंजों सहित 2 पाइपों पर 3 प्रक्रियाओं को बुलाता है। यह सब बैश शेल में बिना किसी पाइप, प्रक्रिया या निर्भरता के किया जा सकता है।
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, जो पर्ल रेगेक्स में, साधन है discard everything matched to the left of the \K। इसलिए, नियमित अभिव्यक्ति के साथ शुरू होने वाले तार की तलाश है http://(जो कि तब खारिज कर दिया गया है \K) इसके बाद 'संभव के रूप में कई गैर- वर्णों के बाद । के साथ संयुक्त -o, इसका मतलब है कि केवल URL मुद्रित किया जाएगा।

आप इसे सीधे पर्ल में भी कर सकते हैं:

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

बहुत अच्छा जवाब। मुझ से +1।
स्मारिका

बहुत अच्छा कॉम्पैक्ट समाधान। मेरा पसंदीदा भी।
असमलैब्स

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
souravc

समस्या यह है कि url.comएक अलग url के साथ-साथ abc.com भी इसकी गतिशील है और मुझे शेल स्क्रिप्ट का उपयोग करके इस url को हथियाने की आवश्यकता है।
तरुण

4

इसे फिर से देखना, और एक बैश शेल के अलावा और कुछ भी उपयोग करने की कोशिश करना, एक और एक लाइन समाधान है:

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

जहाँ file.in में 'डर्टी' url लिस्ट है और file.out में 'क्लीन' URL लिस्ट होगी। कोई बाहरी निर्भरता नहीं हैं और किसी भी नई प्रक्रिया या उपधारा को स्पॉन करने की कोई आवश्यकता नहीं है। मूल स्पष्टीकरण और अधिक लचीली स्क्रिप्ट निम्नानुसार है। यहां विधि का एक अच्छा सारांश है , उदाहरण 10-10 देखें। यह बैश में पैटर्न आधारित पैरामीटर प्रतिस्थापन है।

विचार पर विस्तार:

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

किसी भी बाहरी कार्यक्रमों को कॉल करने की आवश्यकता नहीं है। इसके अलावा, निम्नलिखित बैश स्क्रिप्ट, get_urls.shआपको सीधे या स्टड से फाइल पढ़ने की अनुमति देती है:

#!/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, इसलिए यह श, बश, डैश, ksh, zsh के लिए अच्छा है ...
terdon

जीत के लिए बैश!
एंड्रिया कोरबेलिनी

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 := protocol://FQDN[/path][?arguments]

FQDN := [hostname.]domain.tld

0

मेरे लिए, अन्य grepउत्तरों ने लिंक के बाद रिटर्न स्ट्रिंग की जानकारी दी।

यह मेरे लिए केवल बाहर खींचने के लिए काम किया url:

egrep -o "(http(s)?://){1}[^'\"]+"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.