শেল স্ক্রিপ্ট ব্যবহার করে কোনও ফাইল থেকে URL কীভাবে পাবেন get


10

আমার কাছে একটি ফাইল রয়েছে যা ইউআরএল সমন্বিত । আমি শেল স্ক্রিপ্ট ব্যবহার করে সেই ফাইলটি থেকে ইউআরএল পাওয়ার চেষ্টা করছি।

ফাইলটিতে, 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
এরিক কারভালহো

আমি উত্তর Frantique দ্বারা এটি দিয়েছে চেষ্টা http://url.comনাurl.com
তরুণ

1
@ তারুন হ্যাঁ, আমি কেবল এটিই বলতে চেয়েছিলাম যে পাঠ্যটিকে দ্বিগুণ করার দরকার নেই।
এরিক কারভালহো

1
আপনি যখন /শেডের সাথে কোনও কিছুর সাথে মিল রাখতে চান , আপনার সাধারণত একটি আলাদা ডিলিমিটার ব্যবহার করা উচিত, যেমন sed s@http://@@g
কেভিন

2
এটি খুব অদক্ষ, যদিও দ্রবণ 1 টি 4 টি পাইপের উপর 5 টি প্রক্রিয়া কল করে এবং দ্রবণ 2 কল করে 2 রিজেক্স সহ 2 পাইপের উপর 3 টি প্রক্রিয়া processes এটি কোনও কোনও পাইপ, প্রক্রিয়া বা নির্ভরতা ছাড়াই ব্যাশ শেলের মাধ্যমে করা যেতে পারে।
অসিমল্যাবস

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
উঠছেন

সমস্যাটি হ'ল url.comআলাদা url এর পাশাপাশি abc.com এর মতো গতিশীল এবং আমার শেল স্ক্রিপ্ট ব্যবহার করে এই ইউআরএল ধরতে হবে।
যুবক

4

এটি আবার ঘুরে দেখা এবং বাশ শেল ব্যতীত আর কিছু ব্যবহার করার চেষ্টা না করা, অন্য একটি লাইন সমাধান হ'ল:

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

যেখানে ফাইল.ইনেকে 'নোংরা' ইউআরএল তালিকা এবং ফাইল.আউটে 'ক্লিন' ইউআরএল তালিকা থাকবে। কোনও বাহ্যিক নির্ভরতা নেই এবং কোনও নতুন প্রক্রিয়া বা সাবশেলগুলি স্পোন করার দরকার নেই। মূল ব্যাখ্যা এবং আরও নমনীয় স্ক্রিপ্ট অনুসরণ করা হয়। সেখানে পদ্ধতির একটি ভাল সারাংশ এখানে , উদাহরণস্বরূপ 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

ভাল, +1। দৃrict়ভাবে বলতে গেলে, একটি সাবশেল রয়েছে, যখন লুপটি একটি সাবশেলের মধ্যে ঘটে। উজ্জ্বল দিকে, এটি কেবল যে কোনও শেল ছাড়া কাজ করে [t]csh, তাই এটি শ, বাশ, ড্যাশ,
কেএস, জেডএস

জয়ের জন্য বাশ!
Andrea Corbellini

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

FQDN := [hostname.]domain.tld

0

আমার জন্য, অন্য grepউত্তরগুলি লিঙ্কের পরে ফেরত স্ট্রিংয়ের তথ্য দেয়।

এটি কেবলমাত্র টেনে আনতে আমার পক্ষে কাজ করেছে url:

egrep -o "(http(s)?://){1}[^'\"]+"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.