シェルスクリプトを使用してファイルから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
エリックCarvalho 14

私はそれが与えhttp://url.comなかったFrantiqueの答えを試しましたurl.com
Tarun

1
@Tarunはい、私はテキストを二重反転する必要がないと言いたかっただけです。
エリックCarvalho 14

1
/sedで何かと一致させたい場合は、通常、のような別の区切り文字を使用する必要がありますsed s@http://@@g
ケビン

2
これは非常に非効率的ですが、ソリューション1は4つのパイプで5つのプロセスを呼び出し、ソリューション2は2つの正規表現を含む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、Perl正規表現でを使用すること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 2014

とても素敵なコンパクトなソリューション。私のお気に入りも。
AsymLabs 2014

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シェルのみを使用しようとすると、別の1行のソリューションは次のとおりです。

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

file.inには「ダーティー」URLリストが含まれ、file.outには「クリーン」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 ...
terdon

勝利のためにバッシュ!
Andrea Corbellini、2014

3

すべての行にURLが含まれている場合:

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

一部の行のみにURLが含まれている場合:

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

他の行によっては、^define正規表現を変更する必要がある場合があります


それが機能したのは、私が使用したコマンドであるcutステートメントを追加するだけでした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.