1

特定のWebページのhtmlを分析するために書いたこのbashスクリプトがあります。実際にすべきことは、そのページのドメインを返すことです。現在、その Web ページの URL の数を返しています。

#!/bin/sh

echo "Enter a url eg www.bbc.com:"
read url
content=$(wget "$url" -q -O -)
echo "Enter file name to store URL output"
read file
echo $content > $file
echo "Enter file name to store filtered links:"
read links
found=$(cat $file | grep -o -E 'href="([^"#]+)"' | cut -d '"' -f2 | sort | uniq | awk   '/http/' > $links)
output=$(egrep -o '^http://[^/]+/' $links | sort | uniq -c > out)
cat out

URL の代わりにドメインを返すようにするにはどうすればよいですか。私のプログラミング知識から、右から解析することになっていることはわかっていますが、私はbashスクリプトの初心者です。誰か助けてください。これは私が行った限りです。

4

4 に答える 4

2

編集 2:必要に応じ て式の検索パターンを調整したい場合があることに注意してsedください。このソリューションでは、http[s]?://-protocol とwww.-servers... のみが考慮されます。

編集:
カウントとドメインが必要な場合:

lynx -dump -listonly http://zelleke.com | \
  sed -n '4,$ s@^.*http[s]?://\([^/]*\).*$@\1@p' | \
   sort | \
     uniq -c | \
       sed 's/www.//'

与える

2 wordpress.org
10 zelleke.com

元の回答:

lynxURLからリンクを抽出するために使用したい場合があります

lynx -dump -listonly http://zelleke.com

与える

# blank line at the top of the output
References

   1. http://www.zelleke.com/feed/
   2. http://www.zelleke.com/comments/feed/
   3. http://www.zelleke.com/
   4. http://www.zelleke.com/#content
   5. http://www.zelleke.com/#secondary
   6. http://www.zelleke.com/
   7. http://www.zelleke.com/wp-login.php
   8. http://www.zelleke.com/feed/
   9. http://www.zelleke.com/comments/feed/
  10. http://wordpress.org/
  11. http://www.zelleke.com/
  12. http://wordpress.org/

この出力に基づいて、次の方法で目的の結果を達成します。

lynx -dump -listonly http://zelleke.com | \
  sed -n '4,$ s@^.*http://\([^/]*\).*$@\1@p' | \
   sort -u | \
     sed 's/www.//'

与える

wordpress.org
zelleke.com
于 2012-08-09T08:35:37.743 に答える
2

awk でこれを行うためのより良い方法があることは知っていますが、これを sed の後に追加することでこれを行うことができますawk '/http/':

| sed -e 's;https\?://;;' | sed -e 's;/.*$;;'

次に、並べ替えと一意をその最後に移動します。

行全体が次のようになります。

found=$(cat $file | grep -o -E 'href="([^"#]+)"' | cut -d '"' -f2 | awk   '/http/' | sed -e 's;https\?://;;' | sed -e 's;/.*$;;' | sort | uniq -c > out)

この行を取り除くことができます:

output=$(egrep -o '^http://[^/]+/' $links | sort | uniq -c > out)
于 2012-08-09T08:08:09.433 に答える
0

sed を使用して URL からパスを削除できます。

sed s@http://@@; s@/.*@@

私はあなたにも言いたいのですが、これらの2行は間違っています:

found=$(cat $file | grep -o -E 'href="([^"#]+)"' | cut -d '"' -f2 | sort | uniq | awk   '/http/' > $links)
output=$(egrep -o '^http://[^/]+/' $links | sort | uniq -c > out)

> outリダイレクト ( ) またはコマンド置換のいずれかを行う必要があります$()が、2 つのことを同時に行うことはできません。この場合、変数は空になるためです。

この部分

content=$(wget "$url" -q -O -)
echo $content > $file

このように書くことも良いでしょう:

wget "$url" -q -O - > $file
于 2012-08-09T08:11:48.220 に答える
0

あなたはそれに興味があるかもしれません:

https://www.rfc-editor.org/rfc/rfc3986#appendix-B

正規表現を使用して uri を解析する方法を説明します。

したがって、この方法で左から uri を解析し、ドメイン名とサブドメイン名を含む「権限」を抽出できます。

sed -r 's_^([^:/?#]+:)?(//([^/?#]*))?.*_\3_g';
grep -Eo '[^\.]+\.[^\.]+$' # pipe with first line, give what you need

これは興味深い:

http://www.scribd.com/doc/78502575/124/Extracting-the-Host-from-a-URL

URLは常にこのように始まると仮定します

https?://(www\.)?

本当に危険です。

于 2012-08-09T08:33:52.960 に答える