• ベストアンサー

grepの方法について

私は現在、500ファイル近いjspファイルもしくはhtmlファイルから hrefのリンクだけを抽出する作業を行っています。 下記コマンドでgrepをかけた場合、 後ろにつながる文字列まで抽出されてしまいます。 grep -i -e "href=" ソースファイルとしては、 <a href="ファイルパス.html" target><img src=""> というように、hrefの後ろにつながって 他のタグが記述されてしまっていますが、 hrefの"ファイルパス.html"のみを抽出したいのです。 どうすればよいでしょうか。 お手数かと思いますが、 宜しくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.5

No.2,4 です。 1行に2つ以上<a href=...>があるケースの処理をawkで書いてみました。 [user1@fedora ~]$ cat get_url.sh #!/bin/sh awk -F'href=\"' '/href=/{for (i=2;i<=NF;++i){split($i,s,"\"");print s[1]}}' $1 こういうシェルを作っておいて、chmod +x get_url.sh をしておいて、 [user1@fedora ~]$ find /var/www/html -name \*.html -exec ./get_url.sh {} \; こういう風にすると、 http://dev.mysql.com/doc/mysql/en/drop-table.html http://dev.mysql.com/doc/mysql/en/insert-delayed.html http://dev.mysql.com/doc/mysql/en/insert.html    :    :    : と出てくるようになりました。試してみてください。

googoocgi
質問者

お礼

簡単な質問に対し、とても丁寧にご回答いただきまして どうもありがとうございました。 ご教示いただいたとおり行った所 私の思ったとおりに実行することができました。 どうもありがとうございました。 助かりました。

その他の回答 (5)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.6

もしお使いのgrepがGNU grep であり、かつ-Pオプションが使用可能な状態なら、 grepだけでできます。 grep -P -o '(?<=href=")http://[\w.]+' 同じ行に複数マッチするものがあっても別の行にして出力してくれます。 検索パターンは (?<=href=")http://[^"]+ のほうがよいかも?

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.4

No.2です。すみません、ちょっと私のところと実行環境が違ったようで、思うように動かなかったようです。 grep -i -e "href=" xxx.html | sed -e 's/^.*href=\"\([^\"]*\)\".*$/\1/g' ではいかがでしょうか。 たくさんのファイルを一括検索するのであれば、findを使えばいいのではないでしょうか。上のコマンドを、たとえば上記のコマンドを grep -i -e "href=" $1 | sed -e 's/^.*href=\"\([^\"]*\)\".*$/\1/g' とし、find_url.sh というシェルにしておいて、/aaa/bbb/以下の*.jspと*.htmlを検索するのに、 find /aaa/bbb -name \*.jsp -o -name \*.html -exec find_url.sh {} \; とやるとか。

noname#96023
noname#96023
回答No.3

sedが使えているからシェルが使えているんですよね #/bin/sh for i in *.html echo "ファイル$i" grep -i -e "href=" $i | sed -e 's/^.*a href=\"//' | sed -e 's/html.*/html/' echo "\n\n\n" done こんな感じでどうでしょうか? 同じくテストはしてません また一行に2つ以上のファイル名がある場合は...暇だったら考えます

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.2

こんなのでできないでしょうか。 grep -i -e "href=" xxx.html | sed -e 's/^.*href=\"\([^\"]*\)\".*$/\\1/g' 1行に2つ以上<a href=...>のタグがあると、最初の1つしか抜き出せませんが。そういうケースも考慮して全て抽出するとなると、もうちょっとややこしい方法になると思います。

googoocgi
質問者

お礼

早速、ご回答いただきまして どうもありがとうございます。 実行してみたところ、 \1 \1 というような結果になってしまいました。 どうしてでしょうか。 やはり、一行に複数ある場合は、 複雑になりそうですね。 少し、考えてみます。 ありがとうございました。

noname#96023
noname#96023
回答No.1

grepだけじゃ無理ですね sedと組み合わせて grep -i -e "href=" | sed -e 's/^.*a href=\"//' | sed -e 's/html.*/html/' 試してないですがこんな感じでしょうか。。。

googoocgi
質問者

お礼

早速、ご回答いただきましてどうもありがとうございます。 試してみました。 grep -i -e "href=" *.HTML | sed -e 's/^.*a href=\"//' | sed -e 's/html.*/html/' 500近いファイルを一括検索するためには、 ディレクトリごとにしたいのですが、 ファイル名が出力されないため、 やはり、一ファイルずつしか 無理でしょうか。 簡単な質問ばかりで 申し訳ございませんが、 ご教示願います。

関連するQ&A