2016-09-20 5 views
1

のためのウェブサイトとgrepをカールするバッシュを使用した:私は次の順序でいくつかのことを行いますスクリプトを記述しようとしているキーワード

  1. 「url_list内に含まれるURLのリストからのcURLのウェブサイトは、 .txt "(改行改行)ファイル。
  2. リストの各ウェブサイトについて、そのウェブサイトをgrepして、「keywords.txt」(改行を含む)ファイルに含まれるキーワードを探したいとします。私は次の形式(または類似した何か)で端末に印刷して終了したい
  3. $ URL(つまり含ま一致):(試合をした)$キーワード

Ubuntuで実行できる必要があります(GNU grepなど)

これはcURLとgrepである必要はありません。機能がある限り。

#!/bin/bash 
keywords=$(cat ./keywords.txt) 
urllist=$(cat ./url_list.txt) 
for url in $urllist; do 
     content="$(curl -L -s "$url" | grep -iF "$keywords" /dev/null)" 
     echo "$content" 
done 

をしかし、いくつかの理由で、関係なく、私は微調整や変更しようとするもの、それは1度または別のに失敗し続けていない:

は、これまでのところ私は持っています。

このタスクを実行するにはどうすればよいですか?

おかげ

答えて

3

は、ここで私はそれを行うだろう方法は次のとおりです。

#!/bin/bash 
keywords="$(<./keywords.txt)" 
while IFS= read -r url; do 
    curl -L -s "$url" | grep -ioF "$keywords" | 
     while IFS= read -r keyword; do 
      echo "$url: $keyword" 
     done 
done < ./url_list.txt 

私は何を変えなかった:

  • 私はkeywords.txtを読み取るために$(<./keywords.txt)を使用。これは外部プログラム(元のスクリプトのcat)に依存しません。
  • forループをURLリスト上でループして、whileループに変更しました。私たちがΘ(1)のメモリを使用している(つまり、メモリ内のURLリスト全体を読み込む必要がない)
  • grepから/ dev/nullを削除します。 /dev/nullからのgrep ingは意味がありません。何も見つからないからです。代わりに、grepを引数なしで呼び出して、stdin(この場合はcurlの出力になります)をフィルタリングします。
  • grep-oフラグを付けて、一致するキーワードのみを出力しました。
  • curlの出力をキャプチャしていたサブシェルを削除しました。代わりに、私は直接コマンドを実行し、その出力をwhileループに送ります。これは、URLごとにキーワードの一致以上のものが得られる可能性があるため必要です。
+1

おそらく 'grep -ioF -f。/ keywords.txt'を使用できます。 – anishsane

+0

チャームのように動作します!ありがとうございました! 1つの質問 同じURLに同じキーワードの一致が複数ある場合はどうなりますか? 出力を一意にする方法はありますか? – Probie

+0

@Probie次に、 'curl -L -s" $ url "のようなことをすることができます。 grep -ioF "$ keywords" |並べ替え|ユニーク| '。 – redneb

関連する問題