쉘 스크립트를 사용하여 파일에서 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
@Tarun 예, 텍스트를 두 번 뒤집을 필요가 없다고 말하고 싶었습니다.
Eric Carvalho

1
/sed 와 일치 시키려면 일반적으로 다른 구분 기호를 사용해야합니다 (예 :) sed s@http://@@g.
Kevin

2
그러나 솔루션 1은 4 개의 파이프에서 5 개의 프로세스를 호출하고 솔루션 2는 3 개의 정규식을 포함하여 2 개의 파이프에서 3 개의 프로세스를 호출합니다. 파이프, 프로세스 또는 종속성없이 Bash 셸에서이 모든 작업을 수행 할 수 있습니다.
AsymLabs 2014

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
souravc

아주 좋은 컴팩트 솔루션. 내가 가장 좋아하는 것.
AsymLabs 2013

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.comabc.com과 마찬가지로 다른 URL에 대한 동적이며 쉘 스크립트를 사용 하여이 URL을 가져와야한다는 것입니다.
Tarun

4

이것을 다시 방문하고 Bash 쉘 만 사용하려고하면 다른 한 줄 솔루션이 있습니다.

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

여기서 file.in에는 'dirty'URL 목록이 포함되고 file.out에는 'clean'URL 목록이 포함됩니다. 외부 의존성이 없으며 새로운 프로세스 나 서브 쉘을 생성 할 필요가 없습니다. 원래 설명과보다 유연한 스크립트가 이어집니다. 이 방법의 좋은 요약이 있습니다 여기에 , 예 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

외부 프로그램을 호출 할 필요가 없습니다. 또한 다음 bash 스크립트를 사용 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 엄밀히 말하면, 서브 쉘이 있고 while 루프는 서브 쉘에서 발생합니다. 밝은면에서 이것은 거의 모든 쉘에서 작동 [t]csh하므로 sh, bash, dash, ksh, zsh에
좋습니다

승리를위한 배쉬!
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은 모두 다음의, 때로는 더 :

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.