วิธีรับ 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.
Eric Carvalho

ฉันลองตอบโดย Frantique มันhttp://url.comไม่ให้url.com
Tarun

1
@ ทารันใช่ฉันแค่อยากจะบอกว่าไม่มีความจำเป็นที่จะต้องย้อนกลับของข้อความ
Eric Carvalho

1
เมื่อคุณต้องการเพื่อให้ตรงกับสิ่งที่มี/อยู่ใน sed sed s@http://@@gปกติแล้วคุณควรใช้ตัวคั่นที่แตกต่างกันเช่น
เควิน

2
นี่เป็นวิธีที่ไม่มีประสิทธิภาพมาก แต่โซลูชันที่ 1 เรียก 5 กระบวนการมากกว่า 4 ท่อและโซลูชัน 2 เรียก 3 กระบวนการมากกว่า 2 ท่อรวม 2 regexes ทั้งหมดนี้สามารถทำได้ใน 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 regex 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

ไม่ทำงาน
Tarun

อะไรคือปัญหา? คุณสามารถบอกฉันถ้าคุณได้รับมันถูกต้องecho "define('URL', 'http://url.com');" | awk -F// '{print $2}' | cut -d "'" -f 1
souravc

ปัญหาคือว่าurl.comเพื่อ url ที่แตกต่างกันเช่น abc.com แบบไดนามิกและฉันต้องคว้า url นี้โดยใช้เชลล์สคริปต์
Tarun

4

กลับมาทบทวนอีกครั้งและพยายามที่จะไม่ใช้อะไรเลยนอกจาก Bash shell อีกโซลูชันหนึ่งบรรทัดคือ:

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

โดยที่ file.in มีรายการ url 'สกปรก' และ file.out จะมีรายการ URL 'clean' ไม่มีการพึ่งพาภายนอกและไม่จำเป็นต้องวางไข่กระบวนการหรือ subshells ใหม่ คำอธิบายดั้งเดิมและสคริปต์ที่ยืดหยุ่นมากขึ้นจะตามมา มีสรุปวิธีการที่ดีที่นี่ดูตัวอย่างที่ 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

ไม่จำเป็นต้องเรียกโปรแกรมภายนอกใด ๆ นอกจากนี้สคริปต์ทุบตีต่อไปนี้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 แม้ว่าพูดอย่างเคร่งครัดมี subshell, ในขณะที่ลูปเกิดขึ้นใน subshell ในด้านที่สว่างมันใช้ได้กับกระสุนเกือบทุกตัวยกเว้น[t]cshมันจึงดีสำหรับ sh, bash, dash, ksh, zsh ...
terdon

ทุบตีเพื่อชัยชนะ!
Andrea Corbellini

3

หากทุกบรรทัดมี URL:

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

หากมีเพียงบางบรรทัดเท่านั้นที่มี URL:

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

คุณอาจต้องเปลี่ยน^defineregex ทั้งนี้ขึ้นอยู่กับบรรทัดอื่น ๆ


มันทำงานได้เพียงแค่เพิ่มคำสั่งตัดคำสั่งที่ฉันใช้คือawk -F"'|http://" '/^define/ {print $5}' file.php | cut -d ")" -f 1
Tarun

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}[^'\"]+"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.