Cách lấy URL từ tệp bằng cách sử dụng tập lệnh shell


10

Tôi có một tập tin bao gồm một URL . Tôi đang cố gắng lấy URL từ tệp đó bằng cách sử dụng tập lệnh shell.

Trong tệp, URL là như thế này:

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

Tôi đã cố gắng sử dụng như sau:

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

Nó cho đầu ra là:

'http://url.com');

Nhưng tôi chỉ cần lấy url.commột biến trong tập lệnh shell. Làm thế nào tôi có thể thực hiện điều này?

Câu trả lời:


11

Một cái gì đó như thế này?

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

hoặc là

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

Để loại bỏ http: //.


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

Tôi đã thử câu trả lời của Frantique mà nó http://url.comkhông đưa raurl.com
Tarun

1
@Tarun Vâng, tôi chỉ muốn nói rằng không cần phải đảo ngược văn bản.
Eric Carvalho

1
Khi bạn muốn kết hợp một cái gì đó với /trong sed, bạn thường nên sử dụng một dấu phân cách khác, ví dụ sed s@http://@@g.
Kevin

2
Tuy nhiên, điều này rất không hiệu quả, giải pháp 1 gọi 5 quy trình trên 4 đường ống và giải pháp 2 gọi 3 quy trình trên 2 đường ống trong đó có 2 biểu thức chính quy. Tất cả điều này có thể được thực hiện trong vỏ Bash mà không có bất kỳ đường ống, quy trình hoặc phụ thuộc nào.
AsymLabs

14

Bạn có thể làm mọi thứ đơn giản grep:

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

Từ 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.

Bí quyết là sử dụng phương thức \Knào trong Perl regex discard everything matched to the left of the \K. Vì vậy, biểu thức chính quy tìm các chuỗi bắt đầu bằng http://(sau đó bị loại bỏ vì \K) theo sau là càng nhiều 'ký tự càng tốt. Kết hợp với -o, điều này có nghĩa là chỉ URL sẽ được in.

Bạn cũng có thể làm điều đó trong Perl trực tiếp:

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

câu trả lời rất hay +1 từ tôi.
souravc

Giải pháp nhỏ gọn rất đẹp. Yêu thích của tôi quá.
AsymLabs

5

Thử đi,

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

Không làm việc.
Tarun

vấn đề là gì bạn có thể cho tôi biết nếu bạn đang làm cho nó chính xácecho "define('URL', 'http://url.com');" | awk -F// '{print $2}' | cut -d "'" -f 1
souravc

Vấn đề là url.commột url khác cũng như abc.com động của nó và tôi cần lấy url này bằng shell script.
Tarun

4

Xem lại điều này một lần nữa và cố gắng không sử dụng gì ngoài shell Bash, một giải pháp một dòng khác là:

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

Trong đó file.in chứa danh sách url 'bẩn' và file.out sẽ chứa danh sách URL 'sạch'. Không có sự phụ thuộc bên ngoài và không cần phải sinh ra bất kỳ quy trình hoặc lớp con mới nào. Các giải thích ban đầu và một kịch bản linh hoạt hơn sau. Có một bản tóm tắt tốt về phương pháp ở đây , xem ví dụ 10-10. Đây là sự thay thế tham số dựa trên mẫu trong Bash.

Mở rộng về ý tưởng:

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

Kết quả:

url.com

Không cần phải gọi bất kỳ chương trình bên ngoài. Hơn nữa, tập lệnh bash sau đây get_urls.sh, cho phép bạn đọc tệp trực tiếp hoặc từ 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

Đẹp, +1. Nói đúng ra, có một subshell, vòng lặp while xảy ra trong một subshell. Về mặt tươi sáng, điều này hoạt động với bất kỳ lớp vỏ nào ngoại trừ [t]csh, vì vậy nó tốt cho sh, bash, dash, ksh, zsh ...
terdon

Bash cho chiến thắng!
Andrea Corbellini

3

Nếu tất cả các dòng có chứa một URL:

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

Nếu chỉ một số dòng chứa URL:

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

Tùy thuộc vào các dòng khác, bạn có thể cần phải thay đổi ^defineregex


Nó hoạt động chỉ cần thêm một câu lệnh cắt mà lệnh tôi đã sử dụng làawk -F"'|http://" '/^define/ {print $5}' file.php | cut -d ")" -f 1
Tarun

0

Đơn giản:

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

và nếu bạn cần xóa 'http: //', thì:

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

Vì thế:

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

Nếu bạn cần một phần nhất định của URL, bạn cần tinh chỉnh thuật ngữ của mình, một URL là tất cả những điều sau đây, đôi khi còn hơn thế:

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

FQDN := [hostname.]domain.tld

0

Đối với tôi, các grepcâu trả lời khác được cung cấp thông tin chuỗi trả về sau liên kết.

Điều này làm việc cho tôi chỉ để rút ra url:

egrep -o "(http(s)?://){1}[^'\"]+"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.